001/*
002 * $Id: WeylRelations.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 * Block form: R{x1,...,xn,y1,...,yn; yi*xi = xi yi + 1}.
018 * @author Heinz Kredel.
019 */
020
021public class WeylRelations<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(WeylRelations.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 WeylRelations() {
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 WeylRelations(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. Block form:
061     * R{x1,...,xn,y1,...,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. Block form:
073     * R{x1,...,xn,y1,...,yn; yi*xi = xi yi + 1}.
074     * @param ring solvable polynomial ring factory, ring must have even number
075     *            of variables.
076     * @see edu.jas.poly.RelationGenerator#generate(edu.jas.poly.GenSolvablePolynomialRing)
077     */
078    @Override
079    public void generate(GenSolvablePolynomialRing<C> ring) {
080        if (ring == null) {
081            throw new IllegalArgumentException("WeylRelations, ring == null");
082        }
083        if (ring.nvar <= 1 || (ring.nvar % 2) != 0) {
084            throw new IllegalArgumentException("WeylRelations, wrong nvar = " + ring.nvar);
085        }
086        RelationTable<C> table = ring.table;
087        int r = ring.nvar;
088        int m = r / 2;
089        GenSolvablePolynomial<C> one = ring.getONE().copy();
090        GenSolvablePolynomial<C> zero = ring.getZERO().copy();
091        for (int i = m; i < r; i++) {
092            ExpVector f = ExpVector.create(r, i, 1);
093            int j = i - m;
094            ExpVector e = ExpVector.create(r, j, 1);
095            ExpVector ef = e.sum(f);
096            GenSolvablePolynomial<C> b = one.multiply(ef);
097            GenSolvablePolynomial<C> rel = (GenSolvablePolynomial<C>) b.sum(one);
098            //  = (GenSolvablePolynomial<C>)b.subtract(one);
099            if (rel.isZERO()) {
100                logger.info("ring = " + ring);
101                logger.info("one  = " + one);
102                logger.info("zero = " + zero);
103                logger.info("b    = " + b);
104                logger.info("rel  = " + rel);
105                //System.exit(1);
106                throw new RuntimeException("rel.isZERO()");
107            }
108            //System.out.println("rel = " + rel.toString(ring.vars));
109            table.update(e, f, rel);
110        }
111        if (logger.isDebugEnabled()) {
112            logger.debug("\nWeyl relations = " + table);
113        }
114        return;
115    }
116
117}