001    /*
002     * Created on 03.10.2004
003     * $Id: Katsura.java 3058 2010-03-27 11:05:23Z kredel $
004      */
005    
006    package edu.jas.gb;
007    
008    /**
009     * Class to produce a system of equations as defined by Katsura.
010     * 
011     * @author Heinz Kredel
012     *
013     */
014    public class Katsura {
015    
016       /**
017        * main.
018        */
019        public static void main(String[] args) {
020            if ( args.length == 0 ) {
021               System.out.println("usage: Katsura N <order> <var>");
022               return;
023            }
024            int n = Integer.parseInt(args[0]);
025            Katsura k = null;
026            if ( args.length == 1 ) {               
027               k = new Katsura(n);
028            }
029            if ( args.length == 2 ) {               
030               k = new Katsura("u",n, args[1]);
031            }
032            if ( args.length == 3 ) {               
033            k = new Katsura(args[2],n, args[1]);
034                            }
035            System.out.println("#Katsura equations for N = " + n + ":");
036                    System.out.println("" + k);
037        }
038    
039        final int N;
040        final String var;
041        final String order;
042    
043    
044        /**
045         * Katsura constructor.
046         * @param n problem size.
047         */
048        public Katsura(int n) {
049               this("u", n);
050        }
051    
052    
053        /**
054         * Katsura constructor.
055         * @param v name of variables.
056         * @param n problem size.
057         */
058        public Katsura(String v, int n) {
059               this(v, n, "G");
060        }
061    
062    
063        /**
064         * Katsura constructor.
065         * @param var name of variables.
066         * @param n problem size.
067         * @param order term order letter for output.
068         */
069        public Katsura(String var, int n, String order) {
070               this.var = var;
071               this.N = n;
072               this.order = order;
073        }
074    
075    
076        String sum1() {
077               StringBuffer s = new StringBuffer();
078               for (int i = -N; i <= N; i++) {
079                   s.append(variable(i));
080                   if (i < N) {
081                       s.append(" + ");
082                   }
083               }
084               s.append(" - 1");
085               return s.toString();
086        }
087    
088    
089        String sumUm(int m) {
090               StringBuffer s = new StringBuffer();
091               for (int i = -N; i <= N; i++) {
092                   s.append(variable(i));
093                   s.append("*");
094                   s.append(variable(m - i));
095                   if (i < N) {
096                      s.append(" + ");
097                   }
098               }
099               s.append(" - " + variable(m));
100               return s.toString();
101        }
102    
103    
104        /**
105         * Generate variable list.
106         * @param order term order letter.
107         * @return polynomial ring description.
108         */
109        public String varList(String order) {
110            return varList("Rat",order);
111        }
112    
113    
114        /**
115         * Generate variable list.
116         * @param order term order letter.
117         * @param coeff coefficient ring name.
118         * @return polynomial ring description.
119         */
120        public String varList(String coeff, String order) {
121               StringBuffer s = new StringBuffer();
122               s.append(coeff);
123               s.append("(");
124               // for (int i = 0; i <= N; i++) {
125               for (int i = N; i >=0; i--) {
126                   s.append(variable(i));
127                   if (i > 0) {
128                      s.append(",");
129                   }
130               }
131               s.append(")  ");
132               s.append(order);
133               return s.toString();
134        }
135    
136    
137        /**
138         * toString.
139         * @return Katsura problem as string.
140         */
141        @Override
142         public String toString() {
143               StringBuffer s = new StringBuffer();
144               s.append(varList(order));
145               s.append(System.getProperty("line.separator"));
146               s.append(polyList());
147               return s.toString();
148        }
149    
150    
151        /**
152         * Generate polynomial list.
153         * @return Katsura polynomials as string.
154         */
155        public String polyList() {
156               StringBuffer s = new StringBuffer();
157               s.append("("+System.getProperty("line.separator"));
158               //for (int m = -N + 1; m <= N - 1; m++) { doubles polynomials
159               for (int m = 0; m <= N - 1; m++) {
160                   s.append( sumUm(m) );
161                   s.append(","+System.getProperty("line.separator"));
162               }
163               s.append( sum1() );
164               s.append(System.getProperty("line.separator"));
165               s.append(")"+System.getProperty("line.separator"));
166               return s.toString();
167        }
168    
169    
170        /**
171         * Generate variable string.
172         * @return varaible name as string.
173         */
174        String variable(int i) {
175               if (i < 0) {
176                   return variable(-i);
177               }
178               if (i > N) {
179                   return "0";
180               }
181               return var + i;
182        }
183    
184    }