Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Polynomials/standard_complex_polynomials_io.adb, Revision 1.1.1.1
1.1 maekawa 1: with integer_io; use integer_io;
2: with Characters_and_Numbers; use Characters_and_Numbers;
3: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
4: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
5: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
6: with Standard_Natural_Vectors;
7: with Symbol_Table,Symbol_Table_io; use Symbol_Table;
8:
9: package body Standard_Complex_Polynomials_io is
10:
11: -- INTERNAL VARIABLES :
12:
13: right : constant natural := 75; -- these variables are needed
14: column : natural := 0; -- for the output of long polynomials
15:
16: procedure init_line is
17: begin
18: column := 0;
19: end init_line;
20:
21: procedure line ( file : in file_type; n : natural ) is
22:
23: -- DESCRIPTION :
24: -- this routine decides when a new line on the output has to be taken;
25: -- n is the number of characters that will be written on the output.
26: -- This routine must be invoked before the actual output operation.
27:
28: begin
29: if n >= right - column
30: then new_line(file);
31: column := 0;
32: else column := column + n;
33: end if;
34: end line;
35:
36: -- AUXILIARIES FOR THE INPUT ROUTINES :
37:
38: procedure Build_Number ( file : in file_type;
39: char : in out character; i1,i2 : out integer;
40: ni1,ni2 : out natural; sign : out character ) is
41: -- DESCRIPTION :
42: -- characters are read from the input and a number is build up;
43: -- the result is the number : i1*10^ni2 + i2.
44:
45: -- ON ENTRY :
46: -- file file type of a file that must be opened for input;
47: -- char first character to be analized.
48:
49: -- ON RETURN :
50: -- char first character that is not a digit;
51: -- i1, i2 digits read;
52: -- ni1, ni2 number of digits in i1 and i2;
53: -- sign sign of the number.
54:
55: res1,res2 : integer := 0;
56: min : boolean := false;
57: k1,k2,temp : natural := 0;
58:
59: begin
60: sign := '+';
61: while (char = ' ') loop get(file,char); end loop;
62: if (char = '+') or (char = '-')
63: then min := (char = '-');
64: sign := char;
65: get(file,char);
66: end if;
67: while (char = ' ') loop get(file,char); end loop;
68: loop
69: temp := Convert(char);
70: if temp < 10
71: then if k1 < 9
72: then res1 := res1*10 + temp;
73: k1 := k1 + 1;
74: elsif k2 < 9
75: then res2 := res2*10 + temp;
76: k2 := k2 + 1;
77: else null; -- skip the rest of the numbers
78: end if;
79: get(file,char);
80: else exit;
81: end if;
82: end loop;
83: if min
84: then i1 := -res1; i2 := -res2;
85: else i1 := res1; i2 := res2;
86: end if;
87: ni1 := k1;
88: ni2 := k2;
89: end Build_Number;
90:
91: procedure Build_Number ( file : in file_type;
92: char : in out character; f : out double_float ) is
93: -- DESCRIPTION :
94: -- a floating point number is read
95:
96: f_int1,f_int2,f_quot1,f_quot2,expo,expo2 : integer := 0;
97: f_int,f_quot : double_float := 0.0;
98: k1,k2,nq1,nq2,np1,np2,temp : natural := 0;
99: sign : character;
100: min : boolean;
101:
102: begin
103: Build_Number(file,char,f_int1,f_int2,np1,np2,sign);
104: f_int := double_float(f_int1) * 10.0**np2 + double_float(f_int2);
105: min := (sign = '-');
106: case char is
107: when '.' => get(file,char); -- skip the point
108: temp := Convert(char);
109: if temp < 10
110: then Build_Number(file,char,f_quot1,f_quot2,nq1,nq2,sign);
111: f_quot := double_float(f_quot1) * 10.0**nq2
112: + double_float(f_quot2);
113: end if;
114: if char = 'E'
115: then get(file,char); -- skip the 'E'
116: Build_Number(file,char,expo,expo2,k1,k2,sign);
117: end if;
118: when 'E' => if char = 'E'
119: then get(file,char); -- skip the 'E'
120: Build_Number(file,char,expo,expo2,k1,k2,sign);
121: end if;
122: when others => null;
123: end case;
124: if min
125: then if (f_int = 0.0) and (f_quot = 0.0) and (nq1 = 0) and (np1 = 0)
126: then f := -1.0; -- "-x" = -1*x
127: else f := ( f_int - f_quot*10.0**(-nq1-nq2) )*10.0**expo ;
128: end if;
129: else f := ( f_int + f_quot*10.0**(-nq1-nq2) )*10.0**expo ;
130: end if;
131: end Build_Number;
132:
133: procedure Build_Number ( file : in file_type;
134: char : in out character; c : out Complex_Number ) is
135: -- DESCRIPTION :
136: -- a floating point number is read and converted into a complex number;
137: -- the number may be the quotient of two floating point numbers
138:
139: f1,f2 : double_float;
140:
141: begin
142: Build_Number(file,char,f1);
143: if char = '/'
144: then get(file,char); -- skip the '/'
145: Build_Number(file,char,f2);
146: c := Create(f1/f2);
147: else c := Create(f1);
148: end if;
149: exception
150: when numeric_error => raise INFINITE_NUMBER;
151: end Build_Number;
152:
153: procedure Read_Term ( file : in file_type; char : in out character;
154: n : in natural; termp : in out Poly );
155: -- DESCRIPTION :
156: -- Reads a term from file, char is the first character of the term.
157:
158: procedure Read_Factor ( file : in file_type;
159: char : in out character; n : in natural;
160: d : in out Degrees; pb : in out Poly );
161: -- DESCRIPTION :
162: -- Reads a factor from file, char is the first character of the factor.
163:
164: procedure Read_Factor ( file : in file_type;
165: char : in out character; n : in natural;
166: d : in out Degrees; pb : in out Poly ) is
167:
168: sb : symbol;
169: i : positive := 1;
170: k,ne,ne2 : natural := 0;
171: expo,expo2 : integer := 1;
172: sign : character;
173:
174: begin
175: sb := (sb'range => ' ');
176: while (char = ' ') loop get(file,char); end loop;
177: if char = '('
178: then get(file,pb);
179: get(file,char); -- get a new symbol, skip '('
180: return;
181: end if;
182: -- read the symbol :
183: loop
184: case char is
185: when '+' | '-' | '*' | '^' => exit;
186: when delimiter | ' ' | ')' => exit;
187: when '(' => raise ILLEGAL_SYMBOL;
188: when others => sb(i) := char;
189: i := i+1; get(file,char);
190: end case;
191: end loop;
192: -- check for legality of the symbol :
193: if Convert(sb(1)) < 10
194: then raise ILLEGAL_SYMBOL;
195: else for j in 2..3 loop
196: case sb(j) is
197: when '*' | '+' | '-' | '^' | '/' | ';' | '(' | ')'
198: => raise ILLEGAL_SYMBOL;
199: when others => null;
200: end case;
201: end loop;
202: end if;
203: -- search for the number of the symbol :
204: k := Symbol_Table.get(sb);
205: if k = 0
206: then declare
207: begin
208: Symbol_Table.add(sb,k);
209: exception
210: when OVERFLOW_IN_THE_SYMBOL_TABLE => raise OVERFLOW_OF_UNKNOWNS;
211: end;
212: end if;
213: if k > n
214: then raise OVERFLOW_OF_UNKNOWNS;
215: end if;
216: -- read further :
217: while (char = ' ') loop get(file,char); end loop;
218: if char = '^'
219: then get(file,char); -- skip the '^'
220: Build_Number(file,char,expo,expo2,ne,ne2,sign);
221: d(k) := d(k) + natural(expo);
222: while char = ' ' loop get(file,char); end loop;
223: if char /= '*' -- the case x^2*...
224: then return; -- end of factor
225: else get(file,char); -- skip the '*'
226: end if;
227: elsif char = '*'
228: then get(file,char);
229: if char = '*'
230: then get(file,char); -- the case " x ** expo "
231: Build_Number(file,char,expo,expo2,ne,ne2,sign);
232: d(k) := d(k) + natural(expo);
233: while (char = ' ') loop get(file,char); end loop;
234: if char /= '*'
235: then return; -- end of factor
236: else get(file,char); -- skip the '*'
237: end if;
238: else d(k) := d(k) + 1; -- the case " x * ? "
239: end if;
240: else -- the case " x ?", with ? /= '*' or ' ' or '^' :
241: d(k) := d(k) + 1;
242: return;
243: end if;
244: while (char = ' ') loop get(file,char); end loop;
245: if (char = '-') or (char = '+')
246: then return;
247: end if;
248: if Convert(char) < 10
249: then -- the case " x * c " or " x ** c * c " :
250: Read_Term(file,char,n,pb);
251: else -- the case " x * y " :
252: Read_Factor(file,char,n,d,pb);
253: end if;
254: exception
255: when ILLEGAL_CHARACTER => raise ILLEGAL_CHARACTER;
256: when ILLEGAL_SYMBOL => raise ILLEGAL_SYMBOL;
257: when ILLEGAL_OPERATION => raise ILLEGAL_OPERATION;
258: when INFINITE_NUMBER => raise INFINITE_NUMBER;
259: when OVERFLOW_OF_UNKNOWNS => raise OVERFLOW_OF_UNKNOWNS;
260: when BAD_BRACKET => raise BAD_BRACKET;
261: end Read_Factor;
262:
263: procedure Read_Term ( file : in file_type; char : in out character;
264: n : in natural; termp : in out Poly ) is
265:
266: c : Complex_Number;
267: d : Degrees := new Standard_Natural_Vectors.Vector'(1..n => 0);
268: pb,res,temp : Poly;
269: tmp : Term;
270:
271: procedure Collect_Factor_Polynomial is
272: begin
273: if pb /= Null_Poly
274: then if res = Null_Poly
275: then Copy(pb,res); Clear(pb);
276: else Mul(res,pb); Clear(pb);
277: end if;
278: end if;
279: end Collect_Factor_Polynomial;
280:
281: begin
282: Build_Number(file,char,c);
283:
284: -- look for 'i' :
285:
286: while (char = ' ') loop get(file,char); end loop;
287:
288: if ( c = Create(0.0) ) and then (char = 'i')
289: then -- the case "+ i" :
290: c := Create(0.0,1.0);
291: get(file,char); -- skip 'i'
292: elsif ( c = Create(-1.0) ) and then (char = 'i')
293: then -- the case "- i" :
294: c := Create(0.0,-1.0);
295: get(file,char); -- skip 'i'
296: elsif char = '*'
297: then -- the case ".. c *.." :
298: while (char = ' ') loop get(file,char); end loop;
299: get(file,char); -- skip '*'
300: while (char = ' ') loop get(file,char); end loop;
301: if char = 'i'
302: then -- the case ".. c * i.." :
303: c := Create(0.0,REAL_PART(c));
304: get(file,char); -- skip 'i'
305: else -- the case ".. c * x.." :
306: Read_Factor(file,char,n,d,pb);
307: if pb /= Null_Poly
308: then Clear(res); Copy(pb,res); Clear(pb);
309: end if;
310: end if;
311: else -- the case ".. c ?" :
312: -- will be treated in the loop
313: null;
314: end if;
315:
316: loop
317: case char is
318: when ' ' => get(file,char);
319: when '*' => get(file,char); Read_Factor(file,char,n,d,pb);
320: Collect_Factor_Polynomial;
321: when '+' | '-' => if c = Create(0.0)
322: then raise ILLEGAL_CHARACTER;
323: else exit;
324: end if;
325: when delimiter => exit;
326: when '(' => if c = Create(0.0) or else c = Create(-1.0)
327: then -- the case "+ (" or "- (" :
328: c := Create(0.0);
329: exit;
330: else -- the case "c (" :
331: raise BAD_BRACKET;
332: end if;
333: when ')' => exit;
334: when others => if c = Create(0.0)
335: then c := Create(1.0);
336: Read_Factor(file,char,n,d,pb);
337: elsif c = Create(-1.0)
338: then Read_Factor(file,char,n,d,pb);
339: else raise ILLEGAL_CHARACTER;
340: end if;
341: Collect_Factor_Polynomial;
342: end case;
343: end loop;
344: tmp.cf := c;
345: tmp.dg := d;
346: termp := create(tmp);
347: if Number_Of_Unknowns(res) > 0
348: then Mul(termp,res); Clear(res);
349: end if;
350: exception
351: when ILLEGAL_CHARACTER => raise ILLEGAL_CHARACTER;
352: when ILLEGAL_SYMBOL => raise ILLEGAL_SYMBOL;
353: when ILLEGAL_OPERATION => raise ILLEGAL_OPERATION;
354: when INFINITE_NUMBER => raise INFINITE_NUMBER;
355: when OVERFLOW_OF_UNKNOWNS => raise OVERFLOW_OF_UNKNOWNS;
356: when BAD_BRACKET => raise BAD_BRACKET;
357: end Read_Term;
358:
359: ----------------------------------
360: -- THE INPUT OPERATIONS : --
361: ----------------------------------
362:
363: procedure get ( p : in out Poly ) is
364: begin
365: get(Standard_Input,p);
366: exception
367: when ILLEGAL_CHARACTER => raise ILLEGAL_CHARACTER;
368: when ILLEGAL_SYMBOL => raise ILLEGAL_SYMBOL;
369: when ILLEGAL_OPERATION => raise ILLEGAL_OPERATION;
370: when INFINITE_NUMBER => raise INFINITE_NUMBER;
371: when OVERFLOW_OF_UNKNOWNS => raise OVERFLOW_OF_UNKNOWNS;
372: when BAD_BRACKET => raise BAD_BRACKET;
373: end get;
374:
375: procedure get ( file : in file_type; p : in out Poly ) is
376:
377: n : constant natural := Symbol_Table.Maximal_Size;
378: char,oper : character;
379: term,res,acc : Poly;
380:
381: begin
382: oper := '+';
383: get(file,char);
384: while (char = ' ') loop get(file,char); end loop;
385: if char = '-'
386: then oper := '-';
387: end if;
388: -- the first term can have no sign
389: Read_Term(file,char,n,res); -- therefore read it first
390: loop
391: case char is
392: when ' ' => get(file,char); -- skip blanks
393: when '+' | '-' => oper := char;
394: Read_Term(file,char,n,term);
395: Add(res,term); Clear(term);
396: when delimiter => exit;
397: when '(' => get(file,term);
398: case oper is
399: when '+' => Add(acc,res); Clear(res);
400: Copy(term,res);
401: when '-' => Add(acc,res);Clear(res);
402: Copy(term,res); Min(res);
403: when '*' => Mul(res,term);
404: when others => raise ILLEGAL_OPERATION;
405: end case;
406: Clear(term);
407: get(file,char); -- get new character
408: when ')' => exit;
409: when '*' => if res = Null_Poly
410: then raise ILLEGAL_CHARACTER;
411: else -- the case " ) * " :
412: oper := char; get(file,char); -- skip '*'
413: Read_Term(file,char,n,term);
414: if char /= '('
415: then case oper is
416: when '+' => Add(res,term);
417: when '-' => Sub(res,term);
418: when '*' => Mul(res,term);
419: when others => raise ILLEGAL_OPERATION;
420: end case;
421: end if;
422: Clear(term);
423: end if;
424: when others => raise ILLEGAL_CHARACTER;
425: end case;
426: end loop;
427: p := acc + res;
428: Clear(acc); Clear(res);
429: exception
430: when ILLEGAL_CHARACTER => raise ILLEGAL_CHARACTER;
431: when ILLEGAL_SYMBOL => raise ILLEGAL_SYMBOL;
432: when ILLEGAL_OPERATION => raise ILLEGAL_OPERATION;
433: when INFINITE_NUMBER => raise INFINITE_NUMBER;
434: when OVERFLOW_OF_UNKNOWNS => raise OVERFLOW_OF_UNKNOWNS;
435: when BAD_BRACKET => raise BAD_BRACKET;
436: end get;
437:
438: procedure get ( n : in out natural; p : in out Poly ) is
439: begin
440: get(Standard_Input,n,p);
441: exception
442: when ILLEGAL_CHARACTER => raise ILLEGAL_CHARACTER;
443: when ILLEGAL_SYMBOL => raise ILLEGAL_SYMBOL;
444: when ILLEGAL_OPERATION => raise ILLEGAL_OPERATION;
445: when INFINITE_NUMBER => raise INFINITE_NUMBER;
446: when OVERFLOW_OF_UNKNOWNS => raise OVERFLOW_OF_UNKNOWNS;
447: when BAD_BRACKET => raise BAD_BRACKET;
448: end get;
449:
450: procedure get ( file : in file_type; n : in out natural; p : in out Poly ) is
451: begin
452: get(file,n);
453: if Symbol_Table.Empty
454: then Symbol_Table.Init(n);
455: end if;
456: get(file,p);
457: exception
458: when ILLEGAL_CHARACTER => raise ILLEGAL_CHARACTER;
459: when ILLEGAL_SYMBOL => raise ILLEGAL_SYMBOL;
460: when ILLEGAL_OPERATION => raise ILLEGAL_OPERATION;
461: when INFINITE_NUMBER => raise INFINITE_NUMBER;
462: when OVERFLOW_OF_UNKNOWNS => raise OVERFLOW_OF_UNKNOWNS;
463: when BAD_BRACKET => raise BAD_BRACKET;
464: end get;
465:
466: -- AUXILIARIES FOR OUTPUT ROUTINES :
467:
468: function Is_Imag ( c : Complex_Number ) return boolean is
469: begin
470: return ( REAL_PART(c) = 0.0 );
471: end is_imag;
472:
473: function Is_Real ( c : Complex_Number ) return boolean is
474: begin
475: return ( IMAG_PART(c) = 0.0 );
476: end is_real;
477:
478: function Is_Integer ( f : double_float ) return boolean is
479: begin
480: return ( (f - double_float(integer(f))) = 0.0 );
481: exception
482: when numeric_error => return false;
483: end is_integer;
484:
485: procedure Write_Number ( file : in file_type; i : in integer ) is
486:
487: -- DESCRIPTION :
488: -- writes the integer number with only one blank before it
489:
490: begin
491: for j in 1..8 loop
492: if i < integer(10.0**j)
493: then line(file,j+1);
494: put(file,i,j+1);
495: return;
496: end if;
497: end loop;
498: line(file,11); put(file,i);
499: end Write_Number;
500:
501: procedure Write_Number ( file : in file_type; f : in double_float ) is
502: begin
503: if is_integer(f)
504: then Write_Number(file,integer(f));
505: else line(file,21); put(file,f);
506: end if;
507: end Write_Number;
508:
509: procedure Write_Number ( file : in file_type; c : in Complex_Number ) is
510: begin
511: if Is_Real(c)
512: then Write_Number(file,REAL_PART(c));
513: elsif Is_Imag(c)
514: then Write_Number(file,IMAG_PART(c));
515: line(file,2); put(file,"*i");
516: else line(file,1); put(file,"(");
517: Write_Number(file,REAL_PART(c));
518: if IMAG_PART(c) > 0.0
519: then line(file,2); put(file," +");
520: else line(file,2); put(file," -");
521: end if;
522: if IMAG_PART(c) = 1.0
523: then line(file,1); put(file,"i");
524: elsif IMAG_PART(c) = -1.0
525: then line(file,3); put(file," -i");
526: else Write_Number(file,abs(IMAG_PART(c)));
527: line(file,2); put(file,"*i");
528: end if;
529: line(file,1); put(file,")");
530: end if;
531: end Write_Number;
532:
533: function Length_Factor ( d,i : natural; standard : boolean;
534: pow : power ) return natural is
535: -- DESCRIPTION :
536: -- this procedure computes the number of characters needed
537: -- for the output of one factor
538:
539: l : natural := 0;
540: sb : symbol;
541:
542: begin
543: if standard
544: then if i < 10
545: then l := l + 2;
546: else l := l + 3;
547: end if;
548: else sb := Symbol_Table.get(i);
549: if sb(3) /= ' '
550: then l := l + 3;
551: elsif sb(2) /= ' '
552: then l := l + 2;
553: else l := l + 1;
554: end if;
555: end if;
556: if d > 1
557: then if pow = '^'
558: then l := l + 1;
559: else l := l + 2;
560: end if;
561: if d < 10
562: then l := l + 1;
563: else l := l + 2;
564: end if;
565: end if;
566: return l;
567: end Length_Factor;
568:
569: procedure Write_Factor ( file : in file_type; d,i : in natural;
570: standard : in boolean; pow : in power ) is
571: -- DESCRIPTION :
572: -- Writes the factor corresponding with the ith unknown on file.
573:
574: sb : Symbol;
575:
576: begin
577: if standard
578: then put(file,'x');
579: if i<10
580: then put(file,i,1);
581: else put(file,i,2);
582: end if;
583: else sb := Symbol_Table.get(i); Symbol_Table_io.put(file,sb);
584: end if;
585: if d > 1
586: then if pow = '^'
587: then put(file,'^');
588: else put(file,"**");
589: end if;
590: if d < 10
591: then put(file,d,1);
592: else put(file,d,2);
593: end if;
594: end if;
595: end Write_Factor;
596:
597: -- THE OUTPUT OPERATIONS :
598:
599: procedure put ( p : in Poly; pow : in power ) is
600: begin
601: put(Standard_Output,p,pow);
602: end put;
603:
604: procedure put ( file : in file_type; p : in Poly; pow : in power ) is
605:
606: nn : constant natural := Number_of_Unknowns(p);
607: standard : constant boolean := ( Symbol_Table.Number < nn );
608: first_time : boolean := true;
609:
610: procedure Write_Term ( t : in Term; continue : out boolean ) is
611:
612: -- DESCRIPTION :
613: -- Writes a term is written on file.
614:
615: passed : boolean;
616:
617: begin
618: if first_time
619: then first_time := false;
620: else if (is_real(t.cf) and then REAL_PART(t.cf) > 0.0)
621: or else (is_imag(t.cf) and then IMAG_PART(t.cf) > 0.0)
622: or else (not is_real(t.cf) and then not is_imag(t.cf))
623: then line(file,1); put(file,'+');
624: end if;
625: end if;
626: if Sum(t.dg) = 0
627: then Write_Number(file,t.cf);
628: else if ( t.cf - Create(-1.0) ) + Create(1.0) = Create(1.0)
629: then line(file,1); put(file,'-');
630: elsif ( t.cf - Create(0.0,1.0) ) + Create(1.0) = Create(1.0)
631: then line(file,2); put(file,"i*");
632: elsif ( t.cf - Create(0.0,-1.0) ) + Create(1.0) = Create(1.0)
633: then line(file,3); put(file,"-i*");
634: elsif (t.cf /= Create(1.0))
635: then Write_Number(file,t.cf);
636: line(file,1); put(file,'*');
637: end if;
638: passed := false;
639: for i in t.dg'range loop
640: if t.dg(i) > 0
641: then if passed
642: then line(file,1); put(file,'*');
643: else passed := true;
644: end if;
645: Line(file,Length_Factor(t.dg(i),i,standard,pow));
646: Write_Factor(file,t.dg(i),i,standard,pow);
647: end if;
648: end loop;
649: end if;
650: continue := true;
651: end Write_Term;
652:
653: procedure Write_Terms is new Visiting_Iterator (process => Write_Term);
654:
655: begin
656: init_line;
657: Write_Terms(p);
658: line(file,1); put(file,delimiter);
659: end put;
660:
661: procedure put ( n : in natural; p : in Poly; pow : in power ) is
662: begin
663: put(Standard_Output,n,p,pow);
664: end put;
665:
666: procedure put ( file : in file_type; n : in natural;
667: p : in Poly; pow : in power ) is
668: begin
669: put(file,n,1);
670: put_line(file," ");
671: put(file,p,pow);
672: end put;
673:
674: procedure put ( p : in Poly ) is
675: begin
676: put(Standard_Output,p,'*');
677: end put;
678:
679: procedure put ( file : in file_type; p : in Poly ) is
680: begin
681: put(file,p,'*');
682: end put;
683:
684: procedure put ( p : in Poly; dp : in natural ) is
685: begin
686: put(Standard_Output,p,dp);
687: end put;
688:
689: procedure put ( file : in file_type; p : in Poly; dp : in natural ) is
690: begin
691: put(file,p);
692: end put;
693:
694: procedure put_line ( file : in file_type; p : in Poly; pow : in power ) is
695:
696: n : constant natural := Number_of_Unknowns(p);
697: standard : constant boolean := ( Symbol_Table.Number < n );
698:
699: procedure Write_Term ( t : in Term; continue : out boolean ) is
700: begin
701: new_line(file);
702: if Is_Real(t.cf)
703: then if REAL_PART(t.cf) >= 0.0
704: then put(file,"+");
705: end if;
706: else put(file,"+");
707: end if;
708: Init_Line; Write_Number(file,t.cf);
709: if Sum(t.dg) /= 0
710: then for i in t.dg'range loop
711: if t.dg(i) > 0
712: then put(file,'*');
713: Write_Factor(file,t.dg(i),i,standard,pow);
714: end if;
715: end loop;
716: end if;
717: continue := true;
718: end Write_Term;
719: procedure Write_Terms is new Visiting_Iterator (process => Write_Term);
720:
721: begin
722: Write_Terms(p);
723: put_line(file,";");
724: end put_line;
725:
726: procedure put_line ( p : in Poly; pow : in power ) is
727: begin
728: put_line(Standard_Output,p,pow);
729: end put_line;
730:
731: procedure put_line ( p : in Poly ) is
732: begin
733: put_line(Standard_Output,p,'*');
734: end put_line;
735:
736: procedure put_line ( file : in file_type; p : in Poly ) is
737: begin
738: put_line(file,p,'*');
739: end put_line;
740:
741: procedure Display_Format is
742:
743: s : array(1..24) of string(1..65);
744:
745: begin
746: s( 1):=" A complex multivariate polynomial is denoted as a sequence of";
747: s( 2):="terms, separated by `+' and terminated by the semicolon `;'. The";
748: s( 3):="brackets '(' and ')' must be used to isolate a sequence of terms";
749: s( 4):="as a factor in a complex multivariate polynomial. ";
750: s( 5):=" A term can be either a coefficient or a coefficient, followed";
751: s( 6):="by '*' and a monomial. If in the latter case the coefficient";
752: s( 7):="equals one, then it may be omitted. ";
753: s( 8):=" A coefficient may be denoted as an integer, a rational, a";
754: s( 9):="floating-point or a complex number. ";
755: s(10):=" A monomial is a sequence of powers of unknowns, separated by";
756: s(11):="'*'. The power operator is represented by '**' or '^'. It must";
757: s(12):="be followed by a positive natural number. If the power equals";
758: s(13):="one, then it may be omitted. ";
759: s(14):=" An unknown can be denoted by at most 3 characters. The first";
760: s(15):="character must be a letter and the other two characters must be";
761: s(16):="different from '+', '-', '*', '^', '/', ';', '(' and ')'. The";
762: s(17):="letter i means sqrt(-1), whence it does not represent an unknown.";
763: s(18):="The number of unknowns may not exceed the declared dimension.";
764: s(19):=" Some examples of valid notations of complex multivariate";
765: s(20):="polynomials: ";
766: s(21):=" x**2*y + 1/2*z*y**2 - 2*z + y**3 + x - 1E9/-8.E-6* y + 3; ";
767: s(22):=" x^2*y + z*y^2 - 2*z + y^3 + x - y + 3; ";
768: s(23):=" (1.01 + 2.8*i)*x1**2*x2 + x3**2*x1 - 3*x1 + 2*x2*x3 - 3; ";
769: s(24):=" (x1^2*x2 + x3^2*x1 - 3*x1 + 2*x2*x3 - 3)*x2**2*(x2-1+i); ";
770: for i in s'range loop
771: put_line(s(i));
772: end loop;
773: end Display_Format;
774:
775: end Standard_Complex_Polynomials_io;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>