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 }