[BACK]Return to generic_laurent_polynomials.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Polynomials

Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Polynomials/generic_laurent_polynomials.adb, Revision 1.1.1.1

1.1       maekawa     1: with unchecked_deallocation;
                      2: with Generic_Lists;
                      3: with Graded_Lexicographic_Order;         use Graded_Lexicographic_Order;
                      4:
                      5: package body Generic_Laurent_Polynomials is
                      6:
                      7: -- REPRESENTATION INVARIANT :
                      8: --   1. Only terms with a coefficient different from zero are stored.
                      9: --   2. The terms in any polynomial are ordered from high to low degree
                     10: --      according to the graded lexicographic order.
                     11:
                     12:   MAX_INT : constant natural := 100000;
                     13:
                     14:   use Ring;
                     15:
                     16: -- DATA STRUCTURES :
                     17:
                     18:   package Term_List is new Generic_Lists(Term);
                     19:   type Poly_Rep is new Term_List.List;
                     20:
                     21:   procedure free is new unchecked_deallocation(Poly_Rep,Poly);
                     22:
                     23: -- AUXILIARY OPERATIONS :
                     24:
                     25:   procedure Shuffle ( p : in out Poly ) is
                     26:
                     27:   -- DESCRIPTION :
                     28:   --   Changes the position of the terms in p back to the normal order.
                     29:   --   Needed to guarantee the second representation invariant.
                     30:
                     31:     res : Poly := Null_Poly;
                     32:
                     33:     procedure Shuffle_Term ( t : in Term; cont : out boolean ) is
                     34:     begin
                     35:       Add(res,t);
                     36:       cont := true;
                     37:     end Shuffle_Term;
                     38:     procedure Shuffle_Terms is new Visiting_Iterator(Shuffle_Term);
                     39:
                     40:   begin
                     41:     Shuffle_Terms(p);
                     42:     Clear(p); Copy(res,p); Clear(res);
                     43:   end Shuffle;
                     44:
                     45:   procedure Append_Copy ( first,last : in out Poly_Rep; t : in Term ) is
                     46:
                     47:   -- DESCRIPTION :
                     48:   --   Appends a copy of the term to the list.
                     49:
                     50:     tt : Term;
                     51:
                     52:   begin
                     53:     Copy(t,tt);
                     54:     Append(first,last,tt);
                     55:   end Append_Copy;
                     56:
                     57: -- CONSTRUCTORS :
                     58:
                     59:   function Create ( n : natural ) return Poly is
                     60:   begin
                     61:     return Create(Ring.Create(n));
                     62:   end Create;
                     63:
                     64:   function Create ( n : number ) return Poly is
                     65:
                     66:     t : Term;
                     67:
                     68:   begin
                     69:     Copy(n,t.cf);
                     70:     return Create(t);
                     71:   end Create;
                     72:
                     73:   function Create ( t : Term ) return Poly is
                     74:
                     75:     p : Poly;
                     76:
                     77:   begin
                     78:     if Equal(t.cf,zero)
                     79:      then p := Null_Poly;
                     80:      else declare
                     81:             tt : Term;
                     82:           begin
                     83:             Copy(t,tt);
                     84:             p := new Poly_Rep;
                     85:             Construct(tt,p.all);
                     86:           end;
                     87:     end if;
                     88:     return p;
                     89:   end Create;
                     90:
                     91:   procedure Copy ( t1 : in Term; t2 : in out Term ) is
                     92:   begin
                     93:     Clear(t2);
                     94:     Standard_Integer_Vectors.Copy
                     95:       (Standard_Integer_Vectors.Link_to_Vector(t1.dg),
                     96:        Standard_Integer_Vectors.Link_to_Vector(t2.dg));
                     97:     Copy(t1.cf,t2.cf);
                     98:   end Copy;
                     99:
                    100:   procedure Copy ( p: in Poly_Rep; q : in out Poly_Rep ) is
                    101:
                    102:     lp,lq : Poly_Rep;
                    103:     t : Term;
                    104:
                    105:   begin
                    106:     Clear(q);
                    107:     if not Is_Null(p)
                    108:      then lp := p;
                    109:           while not Is_Null(lp) loop
                    110:             t := Head_Of(lp);
                    111:             Append_Copy(q,lq,t);
                    112:             lp := Tail_Of(lp);
                    113:           end loop;
                    114:     end if;
                    115:   end Copy;
                    116:
                    117:   procedure Copy ( p : in Poly; q : in out Poly ) is
                    118:
                    119:     l : Poly_Rep;
                    120:
                    121:   begin
                    122:     Clear(q);
                    123:     if p /= Null_Poly
                    124:      then Copy(p.all,l);
                    125:           q := new Poly_Rep'(l);
                    126:      else q := Null_Poly;
                    127:     end if;
                    128:   end Copy;
                    129:
                    130: -- SELECTORS :
                    131:
                    132:   function Equal ( t1,t2 : Term ) return boolean is
                    133:   begin
                    134:     if not Equal(t1.dg,t2.dg)
                    135:      then return false;
                    136:      else return Equal(t1.cf,t2.cf);
                    137:     end if;
                    138:   end Equal;
                    139:
                    140:   function Equal ( p,q : Poly_Rep ) return boolean is
                    141:
                    142:     lp, lq : Poly_Rep;
                    143:
                    144:   begin
                    145:     lp := p;
                    146:     lq := q;
                    147:     while not Is_Null(lp) and not Is_Null(lq) loop
                    148:       if not Equal(Head_Of(lp),Head_Of(lq))
                    149:        then return false;
                    150:        else lp := Tail_Of(lp);
                    151:             lq := Tail_Of(lq);
                    152:       end if;
                    153:     end loop;
                    154:     if Is_Null(lp) and Is_Null(lq)
                    155:      then return true;
                    156:      else return false;
                    157:     end if;
                    158:   end Equal;
                    159:
                    160:   function Equal ( p,q : Poly ) return boolean is
                    161:   begin
                    162:     if (p = Null_Poly) and (q = Null_Poly)
                    163:      then return true;
                    164:       elsif (p = Null_Poly) or (q = Null_Poly)
                    165:          then return false;
                    166:          else return Equal(p.all,q.all);
                    167:     end if;
                    168:   end Equal;
                    169:
                    170:   function Number_Of_Unknowns ( p : Poly ) return natural is
                    171:
                    172:     temp : Term;
                    173:
                    174:   begin
                    175:     if (p = Null_Poly) or else Is_Null(p.all)
                    176:      then return 0;
                    177:      else temp := Head_Of(p.all);
                    178:           if temp.dg = null
                    179:            then return 0;
                    180:            else return temp.dg'length;
                    181:           end if;
                    182:     end if;
                    183:   end Number_Of_Unknowns;
                    184:
                    185:   function Number_Of_Terms ( p : Poly ) return natural is
                    186:   begin
                    187:      if (p = Null_Poly) or else Is_Null(p.all)
                    188:       then return 0;
                    189:       else return Length_Of(p.all);
                    190:      end if;
                    191:   end Number_Of_Terms;
                    192:
                    193:   function Degree ( p : Poly ) return integer is
                    194:
                    195:     temp : Term;
                    196:
                    197:   begin
                    198:      if (p = Null_Poly) or else Is_Null(p.all)
                    199:       then return -1;
                    200:       else temp := Head_Of(p.all);
                    201:            if temp.dg = null
                    202:             then return 0;
                    203:             else return integer(Sum(temp.dg));
                    204:            end if;
                    205:      end if;
                    206:   end Degree;
                    207:
                    208:   function Maximal_Degree ( p : Poly; i : natural ) return integer is
                    209:
                    210:     res : integer := -MAX_INT;
                    211:
                    212:     procedure Degree_Term (t : in Term; continue : out boolean) is
                    213:
                    214:       index,temp : integer;
                    215:
                    216:     begin
                    217:       if t.dg /= null
                    218:        then index := t.dg'first + i - 1;
                    219:             temp := t.dg(index);
                    220:             if temp > res
                    221:              then res := temp;
                    222:             end if;
                    223:             continue := true;
                    224:       end if;
                    225:     end Degree_Term;
                    226:     procedure Degree_Terms is new Visiting_Iterator(Degree_Term);
                    227:
                    228:   begin
                    229:     if p = Null_Poly or else Is_Null(p.all)
                    230:      then return -MAX_INT;
                    231:      else Degree_Terms(p);
                    232:           return res;
                    233:     end if;
                    234:   end Maximal_Degree;
                    235:
                    236:   function Maximal_Degrees ( p : Poly ) return Degrees is
                    237:
                    238:     res : Degrees;
                    239:     n : natural := Number_of_Unknowns(p);
                    240:
                    241:     procedure Degree_Term ( t : in Term; cont : out boolean ) is
                    242:       index,temp : integer;
                    243:     begin
                    244:       for i in t.dg'range loop
                    245:         index := t.dg'first + i - 1;
                    246:         temp := t.dg(index);
                    247:         if temp > res(i)
                    248:          then res(i) := temp;
                    249:         end if;
                    250:       end loop;
                    251:       cont := true;
                    252:     end Degree_Term;
                    253:     procedure Degree_Terms is new Visiting_Iterator(Degree_Term);
                    254:
                    255:   begin
                    256:     res := new Standard_Integer_Vectors.Vector'(1..n => -MAX_INT);
                    257:     Degree_Terms(p);
                    258:     return res;
                    259:   end Maximal_Degrees;
                    260:
                    261:   function Minimal_Degree ( p : Poly; i : natural ) return integer is
                    262:
                    263:     res : integer := MAX_INT;
                    264:
                    265:     procedure Degree_Term ( t : in Term; continue : out boolean ) is
                    266:
                    267:       index,temp : integer;
                    268:
                    269:     begin
                    270:       if t.dg /= null
                    271:        then index := t.dg'first + i - 1;
                    272:             temp := t.dg(index);
                    273:             if temp < res
                    274:              then res := temp;
                    275:             end if;
                    276:             continue := true;
                    277:       end if;
                    278:     end Degree_Term;
                    279:     procedure Degree_Terms is new Visiting_Iterator(Degree_Term);
                    280:
                    281:   begin
                    282:     Degree_Terms(p);
                    283:     return res;
                    284:   end Minimal_Degree;
                    285:
                    286:   function Minimal_Degrees ( p : Poly ) return Degrees is
                    287:
                    288:     res : Degrees;
                    289:     n : natural := Number_of_Unknowns(p);
                    290:
                    291:     procedure Degree_Term ( t : in Term; cont : out boolean ) is
                    292:
                    293:       index,temp : integer;
                    294:
                    295:     begin
                    296:       for i in t.dg'range loop
                    297:         index := t.dg'first + i - 1;
                    298:         temp := t.dg(index);
                    299:         if temp < res(i)
                    300:          then res(i) := temp;
                    301:         end if;
                    302:       end loop;
                    303:       cont := true;
                    304:     end Degree_Term;
                    305:     procedure Degree_Terms is new Visiting_Iterator(Degree_Term);
                    306:
                    307:   begin
                    308:     res := new Standard_Integer_Vectors.Vector'(1..n => MAX_INT);
                    309:     Degree_Terms(p);
                    310:     return res;
                    311:   end Minimal_Degrees;
                    312:
                    313:   function "<" ( d1,d2 : Degrees ) return boolean is
                    314:   begin
                    315:     return Standard_Integer_Vectors.Link_to_Vector(d1)
                    316:            < Standard_Integer_Vectors.Link_to_Vector(d2);
                    317:   end "<";
                    318:
                    319:   function ">" ( d1,d2 : Degrees ) return boolean is
                    320:   begin
                    321:     return Standard_Integer_Vectors.Link_to_Vector(d1)
                    322:            > Standard_Integer_Vectors.Link_to_Vector(d2);
                    323:   end ">";
                    324:
                    325:   function Coeff ( p : Poly; d : degrees ) return number is
                    326:
                    327:     l : Poly_Rep;
                    328:     t : term;
                    329:     res : number;
                    330:
                    331:   begin
                    332:     if p = Null_Poly
                    333:      then return zero;
                    334:      else l := p.all;
                    335:           while not Is_Null(l) loop
                    336:             t := Head_Of(l);
                    337:             if t.dg < d
                    338:              then return zero;
                    339:              elsif Equal(t.dg,d)
                    340:                  then Copy(t.cf,res);
                    341:                       return res;
                    342:                  else l := Tail_Of(l);
                    343:             end if;
                    344:           end loop;
                    345:           return zero;
                    346:     end if;
                    347:   end Coeff;
                    348:
                    349: -- ARITHMETICAL OPERATIONS :
                    350:
                    351:   function "+" ( p : Poly; t : Term ) return Poly is
                    352:
                    353:     temp : Poly;
                    354:
                    355:   begin
                    356:     Copy(p,temp);
                    357:     Add(temp,t);
                    358:     return temp;
                    359:   end "+";
                    360:
                    361:   function "+" ( t : Term; p : Poly ) return Poly is
                    362:   begin
                    363:     return p+t;
                    364:   end "+";
                    365:
                    366:   function "+" ( p,q : Poly ) return Poly is
                    367:
                    368:     temp : Poly;
                    369:
                    370:   begin
                    371:     Copy(p,temp);
                    372:     Add(temp,q);
                    373:     return temp;
                    374:   end "+";
                    375:
                    376:   function "+" ( p : Poly ) return Poly is
                    377:
                    378:     res : Poly;
                    379:
                    380:   begin
                    381:     Copy(p,res);
                    382:     return res;
                    383:   end "+";
                    384:
                    385:   function "-" ( p : Poly; t : Term ) return Poly is
                    386:
                    387:     temp : Poly;
                    388:
                    389:   begin
                    390:     Copy(p,temp);
                    391:     Sub(temp,t);
                    392:     return temp;
                    393:   end "-";
                    394:
                    395:   function "-" ( t : Term; p : Poly ) return Poly is
                    396:
                    397:     temp : Poly;
                    398:
                    399:   begin
                    400:     temp := Create(t);
                    401:     Sub(temp,p);
                    402:     return temp;
                    403:   end "-";
                    404:
                    405:   function "-" ( p : Poly ) return Poly is
                    406:
                    407:     temp : Poly;
                    408:
                    409:   begin
                    410:     Copy(p,temp);
                    411:     Min(temp);
                    412:     return temp;
                    413:   end "-";
                    414:
                    415:   function "-" ( p,q : Poly ) return Poly is
                    416:
                    417:     temp : Poly;
                    418:
                    419:   begin
                    420:     Copy(p,temp);
                    421:     Sub(temp,q);
                    422:     return temp;
                    423:   end "-";
                    424:
                    425:   function "*" ( p : Poly; a : number ) return Poly is
                    426:
                    427:     temp : Poly;
                    428:
                    429:   begin
                    430:     Copy(p,temp);
                    431:     Mul(temp,a);
                    432:     return temp;
                    433:   end "*";
                    434:
                    435:   function "*" ( a : number; p : Poly ) return Poly is
                    436:   begin
                    437:     return p*a;
                    438:   end "*";
                    439:
                    440:   function "*" ( p : Poly; t : Term ) return Poly is
                    441:
                    442:     temp : Poly;
                    443:
                    444:   begin
                    445:     Copy(p,temp);
                    446:     Mul(temp,t);
                    447:     return temp;
                    448:   end "*";
                    449:
                    450:   function "*" ( t : Term; p : Poly ) return Poly is
                    451:   begin
                    452:     return p*t;
                    453:   end "*";
                    454:
                    455:   function "*" ( p,q : Poly ) return Poly is
                    456:
                    457:     temp : Poly;
                    458:
                    459:   begin
                    460:     Copy(p,temp);
                    461:     Mul(temp,q);
                    462:     return temp;
                    463:   end "*";
                    464:
                    465:   procedure Add ( p : in out Poly; t : in Term ) is
                    466:
                    467:     l1,l2,temp : Poly_Rep;
                    468:     tt,tp : Term;
                    469:
                    470:   begin
                    471:     if t.cf /= zero
                    472:      then Copy(t,tt);
                    473:           if p = Null_Poly
                    474:            then p := new Poly_Rep;
                    475:                 Construct(tt,p.all);
                    476:            else tp := Head_Of(p.all);
                    477:                 if tt.dg > tp.dg
                    478:                  then Construct(tt,p.all);
                    479:                  elsif Equal(tt.dg,tp.dg)
                    480:                      then Add(tp.cf,tt.cf);
                    481:                           if tp.cf /= zero
                    482:                            then Set_Head(p.all,tp);
                    483:                            else Clear(tp);
                    484:                                 if Is_Null(Tail_Of(p.all))
                    485:                                  then Term_List.Clear(Term_List.List(p.all));
                    486:                                       free(p);
                    487:                                  else Swap_Tail(p.all,l1);
                    488:                                       Term_List.Clear(Term_List.List(p.all));
                    489:                                       p.all := l1;
                    490:                                 end if;
                    491:                           end if;
                    492:                           Clear(tt);
                    493:                      else l1 := p.all;
                    494:                           l2 := Tail_Of(l1);
                    495:                           while not Is_Null(l2) loop
                    496:                             tp := Head_Of(l2);
                    497:                             if tt.dg > tp.dg
                    498:                              then Construct(tt,temp);
                    499:                                   Swap_Tail(l1,temp);
                    500:                                   l1 := Tail_Of(l1);
                    501:                                   Swap_Tail(l1,temp);
                    502:                                   return;
                    503:                              elsif Equal(tt.dg,tp.dg)
                    504:                                  then Add(tp.cf,tt.cf);
                    505:                                       if tp.cf /= zero
                    506:                                        then Set_Head(l2,tp);
                    507:                                        else Clear(tp);
                    508:                                             temp := Tail_Of(l2);
                    509:                                             Swap_Tail(l1,temp);
                    510:                                       end if;
                    511:                                       Clear(tt);
                    512:                                       return;
                    513:                                  else l1 := l2;
                    514:                                       l2 := Tail_Of(l1);
                    515:                             end if;
                    516:                           end loop;
                    517:                           Construct(tt,temp);
                    518:                           Swap_Tail(l1,temp);
                    519:                 end if;
                    520:           end if;
                    521:     end if;
                    522:   end Add;
                    523:
                    524:   procedure Add ( p : in out Poly; q : in Poly ) is
                    525:
                    526:     procedure Add ( t : in Term; continue : out boolean ) is
                    527:     begin
                    528:       Add(p,t);
                    529:       continue := true;
                    530:     end Add;
                    531:     procedure Adds is new Visiting_Iterator(Add);
                    532:
                    533:   begin
                    534:     Adds(q);
                    535:   end Add;
                    536:
                    537:   procedure Sub ( p : in out Poly; t : in Term ) is
                    538:
                    539:     temp : Term;
                    540:
                    541:   begin
                    542:     Standard_Integer_Vectors.Copy
                    543:       (Standard_Integer_Vectors.Link_to_Vector(t.dg),
                    544:        Standard_Integer_Vectors.Link_to_Vector(temp.dg));
                    545:     temp.cf := -t.cf;
                    546:     Add(p,temp);
                    547:     Standard_Integer_Vectors.Clear
                    548:       (Standard_Integer_Vectors.Link_to_Vector(temp.dg));
                    549:     Clear(temp.cf);
                    550:   end Sub;
                    551:
                    552:   procedure Sub ( p : in out Poly; q : in Poly ) is
                    553:
                    554:     temp : Poly := -q;
                    555:
                    556:   begin
                    557:     Add(p,temp);
                    558:     Clear(temp);
                    559:   end Sub;
                    560:
                    561:   procedure Min ( p : in out Poly ) is
                    562:
                    563:     procedure Min ( t : in out Term; continue : out boolean ) is
                    564:     begin
                    565:       Min(t.cf);
                    566:       continue := true;
                    567:     end Min;
                    568:     procedure Min_Terms is new Changing_Iterator (process => Min);
                    569:
                    570:   begin
                    571:     Min_Terms(p);
                    572:   end Min;
                    573:
                    574:   procedure Mul ( p : in out Poly; a : in number ) is
                    575:
                    576:     procedure Mul_Term ( t : in out Term; continue : out boolean ) is
                    577:     begin
                    578:       Mul(t.cf,a);
                    579:       continue := true;
                    580:     end Mul_Term;
                    581:     procedure Mul_Terms is new Changing_Iterator (process => Mul_Term);
                    582:
                    583:   begin
                    584:     Mul_Terms(p);
                    585:   end Mul;
                    586:
                    587:   procedure Mul ( p : in out Poly; t : in Term ) is
                    588:
                    589:     procedure Mul ( tp : in out Term; continue : out boolean ) is
                    590:     begin
                    591:       Standard_Integer_Vectors.Add
                    592:         (Standard_Integer_Vectors.Link_to_Vector(tp.dg),
                    593:          Standard_Integer_Vectors.Link_to_Vector(t.dg));
                    594:       Mul(tp.cf,t.cf);
                    595:       continue := true;
                    596:     end Mul;
                    597:     procedure Mul_Terms is new Changing_Iterator (process => Mul);
                    598:
                    599:   begin
                    600:     Mul_Terms(p);
                    601:   end Mul;
                    602:
                    603:   procedure Mul ( p : in out Poly; q : in Poly ) is
                    604:
                    605:     res : Poly;
                    606:     l : Poly_Rep;
                    607:     t : Term;
                    608:
                    609:   begin
                    610:     if (q = Null_Poly) or else Is_Null(q.all)
                    611:      then Clear(p);
                    612:      else l := q.all;
                    613:           res := Null_Poly;
                    614:           while not Is_Null(l) loop
                    615:             t := Head_Of(l);
                    616:             declare
                    617:               temp : Poly;
                    618:             begin
                    619:               temp := p * t;
                    620:               Add(res,temp);
                    621:               Clear(temp);
                    622:             end;
                    623:             l := Tail_Of(l);
                    624:           end loop;
                    625:           Copy(res,p); Clear(res);
                    626:     end if;
                    627:   end Mul;
                    628:
                    629:   procedure Diff ( p : in out Poly; i : in integer ) is
                    630:
                    631:     procedure Diff_Term ( t : in out Term; continue : out boolean ) is
                    632:
                    633:       temp : number;
                    634:       index : integer := t.dg'first + i - 1;
                    635:
                    636:     begin
                    637:       if t.dg(index) = 0
                    638:        then Clear(t);
                    639:             Copy(zero,t.cf);
                    640:        else temp := Create(t.dg(index));
                    641:             Mul(t.cf,temp);
                    642:             Clear(temp);
                    643:             t.dg(index) := t.dg(index) - 1;
                    644:       end if;
                    645:       continue := true;
                    646:     end Diff_Term;
                    647:     procedure Diff_Terms is new Changing_Iterator( process => Diff_Term );
                    648:
                    649:   begin
                    650:     Diff_Terms(p);
                    651:   end Diff;
                    652:
                    653:   function Diff ( p : Poly; i : integer ) return Poly is
                    654:
                    655:     res : Poly;
                    656:
                    657:   begin
                    658:     Copy(p,res);
                    659:     Diff(res,i);
                    660:     return res;
                    661:   end Diff;
                    662:
                    663: -- ITERATORS :
                    664:
                    665:   procedure Visiting_Iterator ( p : in Poly ) is
                    666:
                    667:     l : Poly_Rep;
                    668:     temp : Term;
                    669:     continue : boolean;
                    670:
                    671:   begin
                    672:     if p /= Null_Poly
                    673:      then l := p.all;
                    674:           while not Is_Null(l) loop
                    675:             temp := Head_Of(l);
                    676:             process(temp,continue);
                    677:             exit when not continue;
                    678:             l := Tail_Of(l);
                    679:           end loop;
                    680:     end if;
                    681:   end Visiting_Iterator;
                    682:
                    683:   procedure Changing_Iterator ( p : in out Poly ) is
                    684:
                    685:     q,lq,lp : Poly_Rep;
                    686:     t : Term;
                    687:     continue : boolean := true;
                    688:
                    689:     procedure Copy_append is
                    690:
                    691:       temp : Term;
                    692:
                    693:     begin
                    694:       Copy(t,temp);
                    695:       if continue
                    696:        then process(temp,continue);
                    697:       end if;
                    698:       if not Equal(temp.cf,zero)
                    699:        then Append(q,lq,temp);
                    700:        else Clear(temp);
                    701:       end if;
                    702:       Clear(t);
                    703:     end Copy_append;
                    704:
                    705:   begin
                    706:     if p = Null_Poly
                    707:      then return;
                    708:      else lp := p.all;
                    709:           while not Is_Null(lp) loop
                    710:             t := Head_Of(lp);
                    711:             Copy_append;
                    712:             lp := Tail_Of(lp);
                    713:           end loop;
                    714:           Term_List.Clear(Term_List.List(p.all));  free(p);
                    715:           if Is_Null(q)
                    716:            then p := Null_Poly;
                    717:            else p := new Poly_Rep'(q);
                    718:           end if;
                    719:           Shuffle(p);  -- ensure the second representation invariant
                    720:     end if;
                    721:   end Changing_Iterator;
                    722:
                    723: -- DESTRUCTORS :
                    724:
                    725:   procedure Clear ( t : in out Term ) is
                    726:   begin
                    727:     Standard_Integer_Vectors.Clear
                    728:       (Standard_Integer_Vectors.Link_to_Vector(t.dg));
                    729:     Clear(t.cf);
                    730:   end Clear;
                    731:
                    732:   procedure Clear ( p : in out Poly_Rep ) is
                    733:
                    734:     l : Poly_Rep := p;
                    735:     t : Term;
                    736:
                    737:   begin
                    738:     if Is_Null(p)
                    739:      then return;
                    740:      else while not Is_Null(l) loop
                    741:             t := Head_Of(l);
                    742:             Clear(t);
                    743:             l := Tail_Of(l);
                    744:           end loop;
                    745:           Term_List.Clear(Term_List.List(p));
                    746:     end if;
                    747:   end Clear;
                    748:
                    749:   procedure Clear ( p : in out Poly ) is
                    750:   begin
                    751:     if p /= Null_Poly
                    752:      then Clear(p.all);
                    753:           free(p);
                    754:           p := Null_Poly;
                    755:     end if;
                    756:   end Clear;
                    757:
                    758: end Generic_Laurent_Polynomials;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>