001/*
002 * Created on 03.10.2004
003 * $Id$
004  */
005
006package edu.jas.gb;
007
008/**
009 * Class to produce a system of equations as defined by Katsura.
010 * 
011 * @author Heinz Kredel
012 *
013 */
014public 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 variable 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}