001/*
002 * $Id: WeylRelations.java 4125 2012-08-19 19:05:22Z kredel $
003 */
004
005package edu.jas.poly;
006
007import org.apache.log4j.Logger;
008
009import edu.jas.structure.RingElem;
010
011
012/**
013 * Generate Relation Table for Weyl Algebras
014 * Adds the respective relations to the relation table
015 * of the given solvable ring factory. Relations are of the 
016 * form x<sub>j</sub> * x<sub>i</sub> = x<sub>i</sub> x<sub>j</sub> + 1.
017 * @author Heinz Kredel.
018 */
019
020public class WeylRelations<C extends RingElem<C>> {
021
022
023    /** The factory for the solvable polynomial ring. 
024     */
025    private final GenSolvablePolynomialRing<C> ring;
026
027
028    private static final Logger logger = Logger.getLogger(WeylRelations.class);
029
030
031    /** The constructor requires a ring factory.
032     * The relation table of this ring is setup to a Weyl Algebra.
033     * @param r solvable polynomial ring factory,
034     * r must have even number of variables.
035     */
036    public WeylRelations(GenSolvablePolynomialRing<C> r) {
037        if ( r == null ) {
038           throw new IllegalArgumentException("WeylRelations, ring == null");
039        }
040        ring = r;
041        if ( ring.nvar <= 1 || (ring.nvar % 2) != 0 ) {
042           throw new IllegalArgumentException("WeylRelations, wrong nvar = "
043                                              + ring.nvar);
044        }
045    }
046
047
048    /** Generates the relation table of this ring.
049     */
050    public void generate() {
051        RelationTable<C> table = ring.table;
052        int r = ring.nvar;
053        int m =  r / 2;
054        //ExpVector z = ring.evzero;
055        GenSolvablePolynomial<C> one  = ring.getONE().copy();
056        GenSolvablePolynomial<C> zero = ring.getZERO().copy();
057        for ( int i = m; i < r; i++ ) {
058            ExpVector f = ExpVector.create(r,i,1); 
059            int j = i - m;
060            ExpVector e = ExpVector.create(r,j,1);
061            ExpVector ef = e.sum(f);
062            GenSolvablePolynomial<C> b = one.multiply(ef);
063            GenSolvablePolynomial<C> rel 
064                = (GenSolvablePolynomial<C>)b.sum(one);
065            //                = (GenSolvablePolynomial<C>)b.subtract(one);
066            if ( rel.isZERO() ) {
067               logger.info("ring = " + ring);
068               logger.info("one  = " + one);
069               logger.info("zero = " + zero);
070               logger.info("b    = " + b);
071               logger.info("rel  = " + rel);
072               //System.exit(1);
073               throw new RuntimeException("rel.isZERO()");
074            }
075            //System.out.println("rel = " + rel.toString(ring.vars));
076            table.update(e,f,rel);
077        }
078        if ( logger.isDebugEnabled() ) {
079           logger.debug("\nWeyl relations = " + table);
080        }
081        return;
082    }
083
084}