Annotation of OpenXM_contrib/PHC/Ada/Schubert/straightening_syzygies.adb, Revision 1.1.1.1
1.1 maekawa 1: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
2: with Standard_Natural_Vectors; use Standard_Natural_Vectors;
3:
4: package body Straightening_Syzygies is
5:
6: -- AUXILIARIES :
7:
8: function Create ( v1,v2 : Vector ) return Bracket_Term is
9:
10: b1 : Bracket(v1'range);
11: b2 : Bracket(v2'range);
12: sig1,sig2 : integer;
13: bm : Bracket_Monomial;
14: bt : Bracket_Term;
15:
16: begin
17: Create(v1,b1,sig1);
18: if Is_Zero(b1)
19: then bt.coeff := Create(0.0);
20: else Create(v2,b2,sig2);
21: if Is_Zero(b2)
22: then bt.coeff := Create(0.0);
23: else bm := Create(b1);
24: Multiply(bm,b2);
25: if sig1*sig2 > 0
26: then bt.coeff := Create(1.0);
27: else bt.coeff := -Create(1.0);
28: end if;
29: end if;
30: end if;
31: bt.monom := bm;
32: return bt;
33: end Create;
34:
35: function Sort ( v : Vector ) return Vector is
36:
37: -- DESCRIPTION :
38: -- Returns the sorted vector v, in increasing order.
39:
40: res : Vector(v'range) := v;
41: ind,min : natural;
42:
43: begin
44: for i in v'first..v'last-1 loop
45: min := res(i);
46: ind := i;
47: for j in i+1..res'last loop
48: if res(j) < min
49: then min := res(j);
50: ind := j;
51: end if;
52: end loop;
53: if ind /= i
54: then res(ind) := res(i);
55: res(i) := min;
56: end if;
57: end loop;
58: return res;
59: end Sort;
60:
61: function Sign ( v1,v2 : Vector ) return integer is
62:
63: -- DESCRIPTION :
64: -- Returns the sign of the permutation (v1,v2).
65:
66: d : constant natural := v1'length+v2'length;
67: b : Bracket(1..d);
68: v : Vector(1..d);
69: sig : integer;
70:
71: begin
72: v(v1'range) := v1;
73: v(v1'last+1..v'last) := v2;
74: Create(v,b,sig);
75: return sig;
76: end Sign;
77:
78: function Complement ( n : natural; v : Vector ) return Vector is
79:
80: -- DESCRIPTION :
81: -- Returns the complement of the vector w.r.t. the set 1..n.
82:
83: res : Vector(1..n-v'length);
84: cnt : natural := 0;
85: found : boolean;
86:
87: begin
88: for i in 1..n loop
89: found := false;
90: for j in v'range loop
91: if v(j) = i
92: then found := true;
93: exit;
94: end if;
95: end loop;
96: if not found
97: then cnt := cnt + 1;
98: res(cnt) := i;
99: end if;
100: end loop;
101: return res;
102: end Complement;
103:
104: procedure Enumerate ( start,i,n : in natural; accu : in out Vector;
105: s : in natural; b1,b2 : in Bracket;
106: frame : in Vector; bp : in out Bracket_Polynomial ) is
107:
108: -- DESCRIPTION :
109: -- Enumerates all subsets of 1..n, of size accu'length, starting to
110: -- fill up accu(i) with entries in start..n.
111:
112: v1,v2 : Vector(1..b1'last);
113:
114: begin
115: if i > accu'last
116: then declare
117: comp : constant Vector := Complement(n,accu);
118: begin
119: v1(b1'first..s-1)
120: := Standard_Natural_Vectors.Vector(b1(b1'first..s-1));
121: for j in accu'range loop
122: v1(s+j-1) := frame(accu(j));
123: end loop;
124: v2(s+1..b2'last)
125: := Standard_Natural_Vectors.Vector(b2(s+1..b2'last));
126: for j in comp'range loop
127: v2(j) := frame(comp(j));
128: end loop;
129: declare
130: bt : Bracket_Term := Create(v1,v2);
131: begin
132: if bt.coeff /= Create(0.0)
133: then if Sign(accu,comp) > 0
134: then Frontal_Add(bp,bt);
135: else Frontal_Min(bp,bt);
136: end if;
137: end if;
138: Clear(bt);
139: end;
140: end;
141: else for l in start..n loop
142: accu(i) := l;
143: Enumerate(l+1,i+1,n,accu,s,b1,b2,frame,bp);
144: end loop;
145: end if;
146: end Enumerate;
147:
148: function Create ( b1,b2 : Bracket ) return Bracket_Term is
149:
150: bm : Bracket_Monomial := Create(b1);
151: bt : Bracket_Term;
152:
153: begin
154: Multiply(bm,b2);
155: bt.coeff := Create(1.0);
156: bt.monom := bm;
157: return bt;
158: end Create;
159:
160: procedure Enumerate2 ( n,d,k,start : in natural; b : in Bracket;
161: accu : in out Bracket;
162: cntstd,cntnonstd : in out natural;
163: nonstd : in out Bracket_Polynomial ) is
164:
165: -- DESCRIPTION :
166: -- Lexicographic enumeration of all brackets, with b < accu and with
167: -- a test whether the pair b*accu forms a Standard monomial.
168:
169: -- ON ENTRY :
170: -- n total number of indices to choose from;
171: -- d number of indices in the brackets;
172: -- k current entry in accu that is to be filled;
173: -- start indices will be taken in between start..n;
174: -- b previously enumerated bracket;
175: -- accu accumulating parameter, filled in upto (k-1)th entry;
176: -- cntstd current number of quadratic standard monomials;
177: -- cntnonstd current number of quadratic nonstandard monomials;
178: -- nonstd current polynomial of quadratic nonstandard monomials.
179:
180: -- ON RETURN :
181: -- accu updated accumulating parameter, accu(k) is filled in;
182: -- cnstd updated number of quadratic standard monomials;
183: -- cntnonstd updated number of quadratic nonstandard monomials;
184: -- nonstd updated polynomial of quadratic nonstandard monomials.
185:
186: s : natural;
187:
188: begin
189: if k > d
190: then if b < accu
191: then s := Brackets.Is_Standard(b,accu);
192: if s = 0
193: then cntstd := cntstd + 1;
194: else cntnonstd := cntnonstd + 1;
195: Add(nonstd,Create(b,accu));
196: end if;
197: end if;
198: else for l in start..n loop
199: accu(k) := l;
200: Enumerate2(n,d,k+1,l+1,b,accu,cntstd,cntnonstd,nonstd);
201: end loop;
202: end if;
203: end Enumerate2;
204:
205: procedure Enumerate1 ( n,d,k,start : natural; acc1,acc2 : in out Bracket;
206: cntstd,cntnonstd : in out natural;
207: nonstd : in out Bracket_Polynomial ) is
208:
209: -- DESCRIPTION :
210: -- Lexicographic enumeration of all brackets, with acc1 < acc2 and with
211: -- a test whether the pair acc1*acc2 forms a Standard monomial.
212: -- Counts the standard and nonstandard monomials and adds every
213: -- nonStandard monomial to the polynomial nonstd.
214:
215: begin
216: if k > d
217: then Enumerate2(n,d,1,acc1(1),acc1,acc2,cntstd,cntnonstd,nonstd);
218: else for l in start..n loop
219: acc1(k) := l;
220: Enumerate1(n,d,k+1,l+1,acc1,acc2,cntstd,cntnonstd,nonstd);
221: end loop;
222: end if;
223: end Enumerate1;
224:
225: procedure Enumerate3 ( n,d,k,start : in natural; accu : in out Vector;
226: bp : in out Bracket_Polynomial ) is
227:
228: -- DESCRIPTION :
229: -- Lexicographic enumerations of all vectors with d-entries, out
230: -- of a set of n natural numbers.
231:
232: -- ON ENTRY :
233: -- n total number of indices to choose from;
234: -- d number of indices in the brackets;
235: -- k current entry in accu that is to be filled;
236: -- start indices will be taken in between start..n;
237: -- accu accumulating parameter, filled in upto (k-1)th entry;
238:
239: -- ON RETURN :
240: -- accu filled in upto the kth entry.
241:
242: begin
243: if k > d
244: then declare
245: comp : constant Vector := Complement(n,accu);
246: acc0 : Vector(1..d+1);
247: t : Bracket_Term;
248: begin
249: -- put(" accu : "); put(accu); put(" complement : "); put(comp);
250: acc0(1) := 0;
251: acc0(2..d+1) := accu(1..d);
252: -- put(" acc0 : "); put(acc0); new_line;
253: t := Create(acc0,comp);
254: if Sign(accu,comp) > 0
255: then Frontal_Add(bp,t);
256: else Frontal_Min(bp,t);
257: end if;
258: Clear(t);
259: end;
260: else for l in start..n-d+k loop
261: accu(k) := l;
262: Enumerate3(n,d,k+1,l+1,accu,bp);
263: end loop;
264: end if;
265: end Enumerate3;
266:
267: -- TARGET OPERATIONS :
268:
269: function Laplace_Expansion ( n,d : natural ) return Bracket_Polynomial is
270:
271: res : Bracket_Polynomial;
272: acc : Vector(1..d);
273:
274: begin
275: Enumerate3(n,d,1,1,acc,res);
276: return res;
277: end Laplace_Expansion;
278:
279: function Straightening_Syzygy ( b1,b2 : Bracket )
280: return Bracket_Polynomial is
281:
282: s : constant natural := Is_Standard(b1,b2);
283: bm : Bracket_Monomial;
284: bp : Bracket_Polynomial;
285:
286: begin
287: if s = 0
288: then bm := Create(b1);
289: Multiply(bm,b2);
290: bp := Create(bm);
291: else declare
292: d1 : constant natural := b1'last+1;
293: frame : Vector(1..d1);
294: accu : Vector(1..d1-s);
295: begin
296: for i in s..b1'last loop
297: frame(i-s+1) := b1(i);
298: end loop;
299: for i in b2'first..s loop
300: frame(d1-s+i) := b2(i);
301: end loop;
302: frame := Sort(frame);
303: Enumerate(1,1,d1,accu,s,b1,b2,frame,bp);
304: end;
305: end if;
306: return bp;
307: end Straightening_Syzygy;
308:
309: function Straightening_Syzygy ( b : Bracket_Monomial )
310: return Bracket_Polynomial is
311:
312: b1,b2 : Link_to_Bracket;
313: bp : Bracket_Polynomial;
314:
315: procedure Get_Bracket ( bb : in Bracket; continue : out boolean ) is
316: begin
317: if b1 = null
318: then b1 := new Bracket'(bb);
319: else b2 := new Bracket'(bb);
320: end if;
321: continue := true;
322: end Get_Bracket;
323: procedure Get_Brackets is new Enumerate_Brackets(Get_Bracket);
324:
325: begin
326: Get_Brackets(b);
327: bp := Straightening_Syzygy(b1.all,b2.all);
328: Clear(b1); Clear(b2);
329: return bp;
330: end Straightening_Syzygy;
331:
332: function nonStandard_Monomials ( n,d : natural ) return Bracket_Polynomial is
333:
334: nonstd : Bracket_Polynomial;
335: b1,b2 : Bracket(1..d);
336: cntstd,cntnonstd : natural := 0;
337:
338: begin
339: Enumerate1(n,d,1,1,b1,b2,cntstd,cntnonstd,nonstd);
340: return nonstd;
341: end nonStandard_Monomials;
342:
343: procedure Enumerate_Syzygies ( p : in Bracket_Polynomial ) is
344:
345: procedure Process_Syzygy ( t : in Bracket_Term; continue : out boolean ) is
346: begin
347: Process(Straightening_Syzygy(t.monom),continue);
348: end Process_Syzygy;
349: procedure Process_Syzygies is new Enumerate_Terms(Process_Syzygy);
350:
351: begin
352: Process_Syzygies(p);
353: end Enumerate_Syzygies;
354:
355: function Straighten ( b1,b2 : Bracket ) return Bracket_Polynomial is
356:
357: bp : Bracket_Polynomial := Straightening_Syzygy(b1,b2);
358:
359: begin
360: return bp;
361: end Straighten;
362:
363: function Straighten ( b : Bracket_Monomial ) return Bracket_Polynomial is
364:
365: bp : Bracket_Polynomial;
366:
367: begin
368: return bp;
369: end Straighten;
370:
371: function Straighten ( b : Bracket_Term ) return Bracket_Polynomial is
372:
373: bp : Bracket_Polynomial;
374:
375: begin
376: return bp;
377: end Straighten;
378:
379: function Straighten ( b : Bracket_Polynomial ) return Bracket_Polynomial is
380:
381: bp : Bracket_Polynomial;
382:
383: begin
384: return bp;
385: end Straighten;
386:
387: end Straightening_Syzygies;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>