001    /*
002     * $Id: ModGroebnerBaseAbstract.java 3445 2010-12-25 17:24:04Z kredel $
003     */
004    
005    package edu.jas.gbmod;
006    
007    
008    import java.util.List;
009    
010    import edu.jas.gb.GroebnerBase;
011    import edu.jas.gbufd.GBFactory;
012    import edu.jas.poly.GenPolynomial;
013    import edu.jas.poly.ModuleList;
014    import edu.jas.poly.PolynomialList;
015    import edu.jas.structure.GcdRingElem;
016    import edu.jas.structure.RingFactory;
017    
018    
019    /**
020     * Module Groebner Bases abstract class. Implements Groebner bases and GB test.
021     * @author Heinz Kredel
022     */
023    
024    public class ModGroebnerBaseAbstract<C extends GcdRingElem<C>> implements ModGroebnerBase<C> {
025    
026    
027        //private static final Logger logger = Logger.getLogger(ModGroebnerBase.class);
028    
029    
030        /**
031         * Used Groebner base algorithm.
032         */
033        protected final GroebnerBase<C> bb;
034    
035    
036        /**
037         * Constructor.
038         */
039        public ModGroebnerBaseAbstract() {
040            bb = GBFactory.getImplementation();
041        }
042    
043    
044        /**
045         * Constructor.
046         */
047        public ModGroebnerBaseAbstract(RingFactory<C> cf) {
048            bb = GBFactory.getImplementation(cf);
049        }
050    
051    
052        /**
053         * Module Groebner base test.
054         */
055        public boolean isGB(int modv, List<GenPolynomial<C>> F) {
056            return bb.isGB(modv, F);
057        }
058    
059    
060        /**
061         * isGB.
062         * @param M a module basis.
063         * @return true, if M is a Groebner base, else false.
064         */
065        public boolean isGB(ModuleList<C> M) {
066            if (M == null || M.list == null) {
067                return true;
068            }
069            if (M.rows == 0 || M.cols == 0) {
070                return true;
071            }
072            PolynomialList<C> F = M.getPolynomialList();
073            int modv = M.cols; // > 0  
074            return bb.isGB(modv, F.list);
075        }
076    
077    
078        /**
079         * Groebner base using pairlist class.
080         */
081        public List<GenPolynomial<C>> GB(int modv, List<GenPolynomial<C>> F) {
082            return bb.GB(modv, F);
083        }
084    
085    
086        /**
087         * GB.
088         * @param M a module basis.
089         * @return GB(M), a Groebner base of M.
090         */
091        public ModuleList<C> GB(ModuleList<C> M) {
092            ModuleList<C> N = M;
093            if (M == null || M.list == null) {
094                return N;
095            }
096            if (M.rows == 0 || M.cols == 0) {
097                return N;
098            }
099    
100            PolynomialList<C> F = M.getPolynomialList();
101            int modv = M.cols;
102            List<GenPolynomial<C>> G = bb.GB(modv, F.list);
103            F = new PolynomialList<C>(F.ring, G);
104            N = F.getModuleList(modv);
105            return N;
106        }
107    
108    }