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}