001 /*
002 * $Id: WeylRelations.java 1894 2008-07-12 13:50:23Z kredel $
003 */
004
005 package edu.jas.poly;
006
007 import org.apache.log4j.Logger;
008
009 import 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
020 public 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().clone();
056 GenSolvablePolynomial<C> zero = ring.getZERO().clone();
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 }