001/*
002 * $Id: Examples.java 4610 2013-09-07 11:30:20Z kredel $
003 */
004
005package edu.jas.ufd;
006
007
008import java.util.SortedMap;
009import java.util.ArrayList;
010import java.util.List;
011
012import org.apache.log4j.BasicConfigurator;
013
014import edu.jas.arith.BigInteger;
015import edu.jas.arith.BigRational;
016import edu.jas.kern.ComputerThreads;
017import edu.jas.poly.AlgebraicNumber;
018import edu.jas.poly.AlgebraicNumberRing;
019import edu.jas.poly.GenPolynomial;
020import edu.jas.poly.GenPolynomialRing;
021import edu.jas.poly.PolyUtil;
022import edu.jas.poly.TermOrder;
023import edu.jas.vector.GenMatrix;
024import edu.jas.vector.GenMatrixRing;
025
026
027/**
028 * Examples for ufd and elementaty integration usage.
029 * @author Heinz Kredel.
030 */
031
032public class Examples {
033
034
035    /**
036     * main.
037     */
038    public static void main(String[] args) {
039        //BasicConfigurator.configure();
040        //// no go: example6();
041        //BasicConfigurator.configure();
042        //example9();
043        example1();
044        example2();
045        BasicConfigurator.configure();
046        example10();
047        ComputerThreads.terminate();
048    }
049
050
051    /**
052     * example1 with GenMatrix. 
053     */
054    public static void example1() {
055        System.out.println("\n\n example 1");
056
057        BigInteger cfac;
058        GenPolynomialRing<BigInteger> fac;
059        QuotientRing<BigInteger> efac;
060        GenPolynomialRing<Quotient<BigInteger>> qfac;
061        GenMatrixRing<GenPolynomial<Quotient<BigInteger>>> mfac;
062
063        cfac = new BigInteger();
064        System.out.println("cfac = " + cfac);
065
066        String[] vc = new String[] {"a", "b"};
067        fac = new GenPolynomialRing<BigInteger>(cfac,vc);
068        System.out.println(" fac = " + fac.toScript());
069
070        efac = new QuotientRing<BigInteger>( fac );
071        System.out.println("efac = " + efac.toScript());
072
073        String[] v = new String[] {"x", "y", "z" };
074        qfac = new GenPolynomialRing<Quotient<BigInteger>>( efac, 3, v );
075        System.out.println("qfac = " + qfac.toScript());
076
077        mfac = new GenMatrixRing<GenPolynomial<Quotient<BigInteger>>>( qfac, 3, 3 );
078        System.out.println("mfac = " + mfac.toScript());
079
080        GenPolynomial<Quotient<BigInteger>> p;
081        p = qfac.random(3,4,2,0.3f);
082        System.out.println("\np = " + p);
083
084        GenMatrix<GenPolynomial<Quotient<BigInteger>>> m;
085        m = mfac.random(3,0.4f);
086        System.out.println("\nm = " + m.toScript());
087    }
088
089
090    /**
091     * example2 with GenPolynomial. 
092     */
093    public static void example2() {
094        System.out.println("\n\n example 2");
095
096        BigInteger fac = new BigInteger();
097        String[] var = new String[]{ "a", "b", "c", "d"};
098        int numvars = var.length;
099        //not needed: TermOrder tord = new TermOrder(TermOrder.INVLEX);
100        GenPolynomialRing<BigInteger> ring = new GenPolynomialRing<BigInteger>(fac,var);
101        List<GenPolynomial<BigInteger>> vars=new ArrayList<GenPolynomial<BigInteger>>();
102        
103        // Build up the polynomial from vars.
104        for(int i=0; i<numvars; i++) vars.add(ring.univariate(i));
105        System.out.println("vars = " + vars);
106        
107        // Silly demo one first. 
108        //  ab+ac+db+dc   ->  (a+d)(b+c)
109        GenPolynomial<BigInteger> tmp=( vars.get(0).multiply(vars.get(1)) ).sum( vars.get(0).multiply(vars.get(2)) )
110        .sum( vars.get(3).multiply(vars.get(1)) ).sum( vars.get(3).multiply(vars.get(2)) );
111        
112        //alternative: tmp = ring.parse("a b + a c + d b + d c");
113        System.out.println("tmp = " +tmp); 
114        
115        Factorization<BigInteger> engine = FactorFactory.getImplementation(fac);
116        SortedMap<GenPolynomial<BigInteger>,Long> factors = engine.factors(tmp);
117        
118        System.out.println("factors = " + factors);
119    }
120
121
122    /**
123     * example6. Partial fraction decomposition.
124     */
125    public static void example6() {
126        System.out.println("\n\nexample 6");
127        // http://www.apmaths.uwo.ca/~rcorless/AM563/NOTES/Nov_16_95/node13.html
128
129        TermOrder to = new TermOrder(TermOrder.INVLEX);
130        BigRational cfac = new BigRational(1);
131        //String[] alpha = new String[] { "alpha" };
132        String[] vars = new String[] { "x" };
133        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, vars);
134
135        // ( 7 x^6 + 1 ) /  ( x^7 + x + 1 )
136        GenPolynomial<BigRational> D = pfac.parse("x^7 + x + 1");
137        GenPolynomial<BigRational> N = PolyUtil.<BigRational> baseDeriviative(D);
138
139        FactorRational engine = new FactorRational();
140
141        PartialFraction<BigRational> F = engine.baseAlgebraicPartialFraction(N, D);
142        System.out.println("\nintegral " + F);
143    }
144
145
146    /**
147     * example9. Rothstein-Trager and absolute factorization algorithm.
148     */
149    public static void example9() {
150        System.out.println("\n\nexample 9");
151
152        TermOrder to = new TermOrder(TermOrder.INVLEX);
153        BigRational cfac = new BigRational(1);
154        //String[] alpha = new String[] { "alpha" };
155        String[] vars = new String[] { "x" };
156        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, vars);
157
158        // 1 / ( x^5 + x - 7 ) 
159        GenPolynomial<BigRational> D = pfac.parse("( x^5 + x - 7 )");
160        GenPolynomial<BigRational> N = pfac.getONE();
161
162        FactorRational engine = new FactorRational();
163
164        PartialFraction<BigRational> F = engine.baseAlgebraicPartialFraction(N, D);
165        System.out.println("\nintegral " + F);
166
167        //PartialFraction<BigRational> Fa = engine.baseAlgebraicPartialFractionIrreducibleAbsolute(N,D);
168        //System.out.println("\nintegral_a " + Fa);
169
170    }
171
172
173    /**
174     * example10. factorization in Q(sqrt(2))(x)(sqrt(x))[y].
175     */
176    public static void example10() {
177        System.out.println("\n\nexample 10");
178
179        TermOrder to = new TermOrder(TermOrder.INVLEX);
180        BigRational cfac = new BigRational(1);
181
182        String[] var_w2 = new String[] { "w2" };
183        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, var_w2);
184        System.out.println("pfac   = " + pfac.toScript());
185
186        GenPolynomial<BigRational> w2 = pfac.parse(" w2^2 - 2 ");
187        System.out.println("w2     = " + w2);
188
189        AlgebraicNumberRing<BigRational> a2fac = new AlgebraicNumberRing<BigRational>(w2, true);
190        System.out.println("a2fac  = " + a2fac.toScript());
191
192        String[] var_x = new String[] { "x" };
193        GenPolynomialRing<AlgebraicNumber<BigRational>> apfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(
194                                                                                                                    a2fac, 1, to, var_x);
195        System.out.println("apfac  = " + apfac.toScript());
196
197        QuotientRing<AlgebraicNumber<BigRational>> qfac = new QuotientRing<AlgebraicNumber<BigRational>>(
198                                                                                                         apfac);
199        System.out.println("qfac   = " + qfac.toScript());
200
201        String[] var_wx = new String[] { "wx" };
202        GenPolynomialRing<Quotient<AlgebraicNumber<BigRational>>> pqfac = new GenPolynomialRing<Quotient<AlgebraicNumber<BigRational>>>(
203                                                                                                                                        qfac, 1, to, var_wx);
204        System.out.println("pqfac  = " + pqfac.toScript());
205
206        GenPolynomial<Quotient<AlgebraicNumber<BigRational>>> wx = pqfac.parse(" wx^2 - { x } ");
207        System.out.println("wx     = " + wx);
208
209        AlgebraicNumberRing<Quotient<AlgebraicNumber<BigRational>>> axfac = new AlgebraicNumberRing<Quotient<AlgebraicNumber<BigRational>>>(
210                                                                                                                                            wx, true);
211        System.out.println("axfac  = " + axfac.toScript());
212
213        String[] var_y = new String[] { "y" };
214        GenPolynomialRing<AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>>> apqfac = new GenPolynomialRing<AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>>>(
215                                                                                                                                                                           axfac, 1, to, var_y);
216        System.out.println("apqfac = " + apqfac.toScript());
217
218        //  ( y^2 - x ) * ( y^2 - 2 ), need {} for recursive coefficients
219        GenPolynomial<AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>>> f;
220        f = apqfac.parse(" ( y^2 - { { x } } ) * ( y^2 - 2 )^2 ");
221        System.out.println("f      = " + f);
222
223        FactorAbstract<AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>>> engine = FactorFactory
224            .getImplementation(axfac);
225        System.out.println("engine = " + engine);
226
227        SortedMap<GenPolynomial<AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>>>, Long> F = engine
228            .factors(f);
229        System.out.println("factors(f) = " + F);
230    }
231
232}