1 package JSci.maths.polynomials; 2 3 import JSci.maths.Complex; 4 import JSci.maths.fields.Field; 5 6 7 13 public class ComplexLagrangeBasis implements PolynomialBasis { 14 private ComplexPolynomial[] _basis; 15 private Complex[] _samplingsX; 16 private int _dim; 17 18 19 public ComplexLagrangeBasis( Field.Member[] samplings ) { 20 if ( samplings == null ) { 21 throw new NullPointerException (); 22 } 23 _dim = samplings.length; 24 _samplingsX = ComplexPolynomialRing.toComplex( samplings ); 25 buildBasis(); 26 } 27 28 33 public Polynomial getBasisVector( int k ) { 34 return _basis[k]; 35 } 36 37 41 public int dimension() { 42 return _dim; 43 } 44 45 48 public Field.Member[] getSamplingPoints() { 49 return _samplingsX; 50 } 51 52 57 public Polynomial superposition( Field.Member[] coeff ) { 58 if ( coeff == null ) { 59 throw new NullPointerException (); 60 } 61 if ( coeff.length != _dim ) { 62 throw new IllegalArgumentException ( "Dimensions do not match" ); 63 } 64 65 Complex[] d = ComplexPolynomialRing.toComplex( coeff ); 66 67 return superposition( d ); 68 } 69 70 75 public ComplexPolynomial superposition( Complex[] c ) { 76 if ( c == null ) { 77 throw new NullPointerException (); 78 } 79 if ( c.length != _dim ) { 80 throw new IllegalArgumentException ( "Dimension of basis is " + _dim + ". Got " 81 + c.length + " coefficients" ); 82 } 83 84 ComplexPolynomial rp = (ComplexPolynomial) ComplexPolynomialRing.getInstance().zero(); 85 for ( int k = 0; k < _dim; k++ ) { 86 ComplexPolynomial b = (ComplexPolynomial) getBasisVector( k ); 87 ComplexPolynomial ba = b.scalarMultiply( c[k] ); 88 rp = (ComplexPolynomial) rp.add( ba ); 89 } 90 91 return rp; 92 } 93 94 private void buildBasis() { 95 _basis = new ComplexPolynomial[_dim]; 96 for ( int k = 0; k < _dim; k++ ) { 97 _basis[k] = (ComplexPolynomial) ComplexPolynomialRing.getInstance().one(); 98 99 Complex fac = Complex.ONE; 100 for ( int j = 0; j < _dim; j++ ) { 101 if ( j == k ) { 102 continue; 103 } else { 104 ComplexPolynomial n = new ComplexPolynomial( 105 new Complex[] { 106 (Complex) _samplingsX[j].negate(), Complex.ONE 107 } ); 108 _basis[k] = (ComplexPolynomial) _basis[k].multiply( n ); 109 110 Complex a = _samplingsX[k]; 111 Complex b = _samplingsX[j]; 112 Complex dif = a.subtract( b ); 113 fac = fac.multiply( dif ); 114 } 115 } 116 117 _basis[k] = _basis[k].scalarDivide( fac ); 118 } 119 } 120 } 121 | Popular Tags |