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