001/*
002 * $Id: WeylRelationsIterated.java 4508 2013-07-25 08:31:15Z kredel $
003 */
004
005package edu.jas.poly;
006
007
008import org.apache.log4j.Logger;
009
010import edu.jas.structure.RingElem;
011
012
013/**
014 * Generate Relation Table for Weyl Algebras Adds the respective relations to
015 * the relation table 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 * Iterated form: R{x1,y1,...,xn,yn; yi*xi = xi yi + 1}.
018 * @author Heinz Kredel.
019 */
020
021public class WeylRelationsIterated<C extends RingElem<C>> implements RelationGenerator<C> {
022
023
024    /**
025     * The factory for the solvable polynomial ring.
026     */
027    private final GenSolvablePolynomialRing<C> ring;
028
029
030    private static final Logger logger = Logger.getLogger(WeylRelationsIterated.class);
031
032
033    /**
034     * The no argument constructor. The relation table of this ring is setup to
035     * a Weyl Algebra.
036     */
037    public WeylRelationsIterated() {
038        ring = null;
039    }
040
041
042    /**
043     * The constructor requires a ring factory. The relation table of this ring
044     * is setup to a Weyl Algebra.
045     * @param r solvable polynomial ring factory, r must have even number of
046     *            variables.
047     */
048    public WeylRelationsIterated(GenSolvablePolynomialRing<C> r) {
049        if (r == null) {
050            throw new IllegalArgumentException("WeylRelations, ring == null");
051        }
052        ring = r;
053        if (ring.nvar <= 1 || (ring.nvar % 2) != 0) {
054            throw new IllegalArgumentException("WeylRelations, wrong nvar = " + ring.nvar);
055        }
056    }
057
058
059    /**
060     * Generates the relation table of this ring. Iterated form:
061     * R{x1,y1,...,xn,yn; yi*xi = xi yi + 1}.
062     */
063    public void generate() {
064        if (ring == null) {
065            throw new IllegalArgumentException("WeylRelations, ring == null");
066        }
067        generate(ring);
068    }
069
070
071    /**
072     * Generates the relation table of this ring. Iterated form:
073     * R{x1,y1,...,xn,yn; yi*xi = xi yi + 1}.
074     * @param ring solvable polynomial ring factory, ring must have even number
075     *            of variables.
076     */
077    public void generate(GenSolvablePolynomialRing<C> ring) {
078        if (ring == null) {
079            throw new IllegalArgumentException("WeylRelations, ring == null");
080        }
081        if (ring.nvar <= 1 || (ring.nvar % 2) != 0) {
082            throw new IllegalArgumentException("WeylRelations, wrong nvar = " + ring.nvar);
083        }
084        RelationTable<C> table = ring.table;
085        int r = ring.nvar;
086        //int m =  r / 2;
087        GenSolvablePolynomial<C> one = ring.getONE().copy();
088        GenSolvablePolynomial<C> zero = ring.getZERO().copy();
089        for (int i = 1; i <= r; i += 2) {
090            ExpVector f = ExpVector.create(r, i, 1);
091            int j = i - 1;
092            ExpVector e = ExpVector.create(r, j, 1);
093            ExpVector ef = e.sum(f);
094            GenSolvablePolynomial<C> b = one.multiply(ef);
095            GenSolvablePolynomial<C> rel = (GenSolvablePolynomial<C>) b.sum(one);
096            //  = (GenSolvablePolynomial<C>)b.subtract(one);
097            if (rel.isZERO()) {
098                logger.info("ring = " + ring);
099                logger.info("one  = " + one);
100                logger.info("zero = " + zero);
101                logger.info("b    = " + b);
102                logger.info("rel  = " + rel);
103                //System.exit(1);
104                throw new RuntimeException("rel.isZERO()");
105            }
106            //System.out.println("rel = " + rel.toString(ring.vars));
107            table.update(e, f, rel);
108        }
109        if (logger.isDebugEnabled()) {
110            logger.debug("\nWeyl relations = " + table);
111        }
112        return;
113    }
114
115}