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}