All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.jas.gbmod.ModSolvableGroebnerBaseAbstract Maven / Gradle / Ivy

The newest version!
/*
 * $Id: ModSolvableGroebnerBaseAbstract.java 4104 2012-08-18 10:00:59Z kredel $
 */

package edu.jas.gbmod;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;


import edu.jas.structure.RingElem;

import edu.jas.gb.SolvableGroebnerBase;
import edu.jas.gb.SolvableGroebnerBaseSeq;
import edu.jas.poly.GenSolvablePolynomial;
import edu.jas.poly.GenSolvablePolynomialRing;
import edu.jas.poly.ModuleList;
import edu.jas.poly.PolynomialList;
import edu.jas.poly.TermOrder;



/**
 * Module solvable Groebner Bases class.
 * Implements module solvable Groebner bases and GB test.
 * @param  coefficient type
 * @author Heinz Kredel
 */

public class ModSolvableGroebnerBaseAbstract> 
       implements ModSolvableGroebnerBase {

    private static final Logger logger = Logger.getLogger(ModSolvableGroebnerBase.class);
    private final boolean debug = logger.isDebugEnabled();


    /**
     * Used Solvable Groebner base algorithm.
     */
    protected final SolvableGroebnerBase sbb;


    /**
     * Constructor.
     */
    public ModSolvableGroebnerBaseAbstract() {
        sbb = new SolvableGroebnerBaseSeq();
    }


    /**
     * Module left Groebner base test.
     * @param modv number of modul variables.
     * @param F a module basis.
     * @return true, if F is a left Groebner base, else false.
     */
    public boolean 
           isLeftGB(int modv, List> F) {  
        return sbb.isLeftGB(modv,F);
    }


    /**
     * Module left Groebner base test.
     * @param M a module basis.
     * @return true, if M is a left Groebner base, else false.
     */
    public boolean 
           isLeftGB(ModuleList M) {  
        if ( M == null || M.list == null ) {
            return true;
        }
        if ( M.rows == 0 || M.cols == 0 ) {
            return true;
        }
        int modv = M.cols; // > 0  
        PolynomialList F = M.getPolynomialList();
        return sbb.isLeftGB(modv,F.castToSolvableList());
    }


    /**
     * Left Groebner base using pairlist class.
     * @param modv number of modul variables.
     * @param F a module basis.
     * @return leftGB(F) a left Groebner base for F.
     */
    public List> 
           leftGB(int modv, List> F) {  
        return sbb.leftGB(modv,F);
    }

    /**
     * Left Groebner base using pairlist class.
     * @param M a module basis.
     * @return leftGB(M) a left Groebner base for M.
     */
    @SuppressWarnings("unchecked")
    public ModuleList 
           leftGB(ModuleList M) {  
        ModuleList N = M;
        if ( M == null || M.list == null ) {
            return N;
        }
        if ( M.rows == 0 || M.cols == 0 ) {
            return N;
        }
        PolynomialList F = M.getPolynomialList();
        if ( debug ) {
           logger.info("F left +++++++++++++++++++ \n" + F);
        }
        GenSolvablePolynomialRing sring 
            = (GenSolvablePolynomialRing)F.ring;
        int modv = M.cols;
        List> G 
            = sbb.leftGB(modv,F.castToSolvableList());
        F = new PolynomialList(sring,G);
        if ( debug ) {
           logger.info("G left +++++++++++++++++++ \n" + F);
        }
        N = F.getModuleList(modv);
        return N;
    }



    /**
     * Module twosided Groebner base test.
     * @param modv number of modul variables.
     * @param F a module basis.
     * @return true, if F is a twosided Groebner base, else false.
     */
    public boolean 
           isTwosidedGB(int modv, List> F) {  
        return sbb.isTwosidedGB(modv,F);
    }

    /**
     * Module twosided Groebner base test.
     * @param M a module basis.
     * @return true, if M is a twosided Groebner base, else false.
     */
    public boolean 
           isTwosidedGB(ModuleList M) {  
        if ( M == null || M.list == null ) {
            return true;
        }
        if ( M.rows == 0 || M.cols == 0 ) {
            return true;
        }
        PolynomialList F = M.getPolynomialList();
        int modv = M.cols; // > 0  
        return sbb.isTwosidedGB(modv,F.castToSolvableList());
    }


    /**
     * Twosided Groebner base using pairlist class.
     * @param modv number of modul variables.
     * @param F a module basis.
     * @return tsGB(F) a twosided Groebner base for F.
     */
    public List> 
           twosidedGB(int modv, List> F) {  
        return sbb.twosidedGB(modv,F);
    }

    /**
     * Twosided Groebner base using pairlist class.
     * @param M a module basis.
     * @return tsGB(M) a twosided Groebner base for M.
     */
    @SuppressWarnings("unchecked")
    public ModuleList 
           twosidedGB(ModuleList M) {  
        ModuleList N = M;
        if ( M == null || M.list == null ) {
            return N;
        }
        if ( M.rows == 0 || M.cols == 0 ) {
            return N;
        }
        PolynomialList F = M.getPolynomialList();
        GenSolvablePolynomialRing sring 
            = (GenSolvablePolynomialRing)F.ring;
        int modv = M.cols;
        List> G 
            = sbb.twosidedGB(modv,F.castToSolvableList());
        F = new PolynomialList(sring,G);
        N = F.getModuleList(modv);
        return N;
    }


    /**
     * Module right Groebner base test.
     * @param modv number of modul variables.
     * @param F a module basis.
     * @return true, if F is a right Groebner base, else false.
     */
    public boolean 
           isRightGB(int modv, List> F) {  
        return sbb.isRightGB(modv,F);
    }


    /**
     * Module right Groebner base test.
     * @param M a module basis.
     * @return true, if M is a right Groebner base, else false.
     */
    public boolean 
           isRightGB(ModuleList M) {  
        if ( M == null || M.list == null ) {
            return true;
        }
        if ( M.rows == 0 || M.cols == 0 ) {
            return true;
        }
        int modv = M.cols; // > 0  
        PolynomialList F = M.getPolynomialList();
        //System.out.println("F test = " + F);
        return sbb.isRightGB( modv, F.castToSolvableList() );
    }


    /**
     * Right Groebner base using pairlist class.
     * @param modv number of modul variables.
     * @param F a module basis.
     * @return rightGB(F) a right Groebner base for F.
     */
    public List> 
           rightGB(int modv, List> F) {  
        if ( modv == 0 ) {
           return sbb.rightGB(modv,F);
        }
        throw new UnsupportedOperationException("modv != 0 not jet implemented");
        // return sbb.rightGB(modv,F);
    }


    /**
     * Right Groebner base using pairlist class.
     * @param M a module basis.
     * @return rightGB(M) a right Groebner base for M.
     */
    @SuppressWarnings("unchecked")
    public ModuleList 
           rightGB(ModuleList M) {  
        ModuleList N = M;
        if ( M == null || M.list == null ) {
            return N;
        }
        if ( M.rows == 0 || M.cols == 0 ) {
            return N;
        }
        if ( debug ) {
           logger.info("M ====================== \n" + M);
        }
        TermOrder to = M.ring.tord;
        if ( to.getSplit() <= M.ring.nvar ) {
            throw new IllegalArgumentException("extended TermOrders not supported for rightGBs: " + to);
        }
        List>> mlist = M.castToSolvableList();
        GenSolvablePolynomialRing sring 
            = (GenSolvablePolynomialRing)M.ring;
        GenSolvablePolynomialRing rring = sring.reverse(true); //true
        sring = rring.reverse(true); // true

        List>> nlist = 
            new ArrayList>>( M.rows );
        for ( List> row : mlist ) {
            List> nrow = 
                new ArrayList>( row.size() );
            for ( GenSolvablePolynomial elem : row ) {
                GenSolvablePolynomial nelem 
                   = (GenSolvablePolynomial)elem.reverse(rring);
                nrow.add( nelem );
            }
            nlist.add( nrow );
        }
        ModuleList rM = new ModuleList( rring, nlist );
        if ( debug ) {
           logger.info("rM -------------------- \n" + rM);
        }
        ModuleList rMg = leftGB( rM );
        if ( debug ) {
           logger.info("rMg -------------------- \n" + rMg);
           logger.info("isLeftGB(rMg) ---------- " + isLeftGB(rMg));
        }
        mlist = rMg.castToSolvableList();
        nlist = new ArrayList>>( rMg.rows );
        for ( List> row : mlist ) {
            List> nrow = 
                new ArrayList>( row.size() );
            for ( GenSolvablePolynomial elem : row ) {
                GenSolvablePolynomial nelem 
                   = (GenSolvablePolynomial)elem.reverse(sring);
                nrow.add( nelem );
            }
            nlist.add( nrow );
        }
        ModuleList Mg = new ModuleList( sring, nlist );
        if ( debug ) {
           logger.info("Mg -------------------- \n" + Mg);
           logger.info("isRightGB(Mg) --------- " + isRightGB(Mg));
        }
        return Mg;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy