[BACK]Return to generic_laur_poly_functions.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_laur_poly_functions.adb, Revision 1.1.1.1

1.1       maekawa     1: with unchecked_deallocation;
                      2: with Standard_Integer_Vectors;
                      3: with Standard_Integer_Matrices;          use Standard_Integer_Matrices;
                      4:
                      5: package body Generic_Laur_Poly_Functions is
                      6:
                      7: -- NOTE : Evaluation is not guaranteed to work for negative exponents...
                      8:
                      9: -- DATA STRUCTURES :
                     10:
                     11:   MAX_INT : constant natural := 100000;
                     12:
                     13:   type kind is (coefficient,polynomial);
                     14:   type Poly_Rec ( k : kind := coefficient ) is record
                     15:     case k is
                     16:       when coefficient => c : number;
                     17:       when polynomial  => p : Eval_Poly;
                     18:     end case;
                     19:   end record;
                     20:   type Coeff_Poly_Rec ( k : kind := coefficient ) is record
                     21:     case k is
                     22:       when coefficient => c : integer;
                     23:       when polynomial  => p : Eval_Coeff_Poly;
                     24:     end case;
                     25:   end record;
                     26:
                     27:   type Eval_Poly_Rep is array(integer range <>) of Poly_Rec;
                     28:   type Eval_Coeff_Poly_Rep is array(integer range <>) of Coeff_Poly_Rec;
                     29:
                     30:   procedure free is new unchecked_deallocation(Eval_Poly_Rep,Eval_Poly);
                     31:   procedure free is
                     32:     new unchecked_deallocation(Eval_Coeff_Poly_Rep,Eval_Coeff_Poly);
                     33:
                     34: -- AUXILIARY OPERATIONS :
                     35:
                     36:   function Convert ( c : number; n : natural ) return natural is
                     37:
                     38:   -- DESCRIPTION :
                     39:   --   Returns the corresponding value for c, when it lies in 1..n,
                     40:   --   otherwise 0 is returned.
                     41:
                     42:   begin
                     43:     for i in 1..n loop
                     44:       if c = Create(i)
                     45:        then return i;
                     46:       end if;
                     47:     end loop;
                     48:     return 0;
                     49:   end Convert;
                     50:
                     51:   function Head_Term ( p : Poly ) return Term is
                     52:
                     53:   -- DESCRIPTION :
                     54:   --   Returns the leading term of the polynomial.
                     55:
                     56:     res : Term;
                     57:
                     58:     procedure Scan_Term ( t : in Term; continue : out boolean ) is
                     59:     begin
                     60:       res := t;
                     61:       continue := false;
                     62:     end Scan_Term;
                     63:     procedure Scan_Terms is new Visiting_Iterator(Scan_Term);
                     64:
                     65:   begin
                     66:     Scan_Terms(p);
                     67:     return res;
                     68:   end Head_Term;
                     69:
                     70:   procedure Initialize ( evpr : in out Eval_Poly_Rep ) is
                     71:   begin
                     72:     for i in evpr'range loop
                     73:       declare
                     74:         nullpr : Poly_Rec(polynomial);
                     75:       begin
                     76:         nullpr.p := null;
                     77:         evpr(i) := nullpr;
                     78:       end;
                     79:     end loop;
                     80:   end Initialize;
                     81:
                     82:   procedure Initialize ( evpr : in out Eval_Coeff_Poly_Rep ) is
                     83:   begin
                     84:     for i in evpr'range loop
                     85:       declare
                     86:         nullpr : Coeff_Poly_Rec(polynomial);
                     87:       begin
                     88:         nullpr.p := null;
                     89:         evpr(i) := nullpr;
                     90:       end;
                     91:     end loop;
                     92:   end Initialize;
                     93:
                     94:   procedure Initialize ( p : in Poly; cff : out Vector; deg : out Matrix ) is
                     95:
                     96:   -- DESCRIPTION :
                     97:   --   Returns a vector/matrix representation of the polynomial p.
                     98:   --   Starts filling in backwards, since the highest degrees are in front
                     99:   --   of the list.  This could reduce the sorting time later.
                    100:
                    101:     ind : natural := cff'last+1;
                    102:
                    103:     procedure Scan_Term ( t : in Term; continue : out boolean ) is
                    104:     begin
                    105:       ind := ind-1;
                    106:       Copy(t.cf,cff(ind));
                    107:       for j in t.dg'range loop
                    108:         deg(ind,j) := t.dg(j);
                    109:       end loop;
                    110:       continue := true;
                    111:     end Scan_Term;
                    112:     procedure Scan_Terms is new Visiting_Iterator(Scan_Term);
                    113:
                    114:   begin
                    115:     Scan_Terms(p);
                    116:   end Initialize;
                    117:
                    118:   procedure Swap ( cff : in out Vector; deg : in out Matrix;
                    119:                    i,j,k : in natural ) is
                    120:
                    121:   -- DESCRIPTION :
                    122:   --   Swaps the ith row with the jth row, starting from the kth column.
                    123:
                    124:     tmpcff : number;
                    125:     tmpdeg : natural;
                    126:
                    127:   begin
                    128:     Copy(cff(i),tmpcff);
                    129:     Copy(cff(j),cff(i));
                    130:     Copy(tmpcff,cff(j));
                    131:     Clear(tmpcff);
                    132:     for kk in k..deg'last(2) loop
                    133:       tmpdeg := deg(i,kk);
                    134:       deg(i,kk) := deg(j,kk);
                    135:       deg(j,kk) := tmpdeg;
                    136:     end loop;
                    137:   end Swap;
                    138:
                    139:   procedure Sort ( cff : in out Vector; deg : in out Matrix;
                    140:                    i1,i2,k : in natural ) is
                    141:
                    142:   -- DESCRIPTION :
                    143:   --   Sorts the elements in the kth column of the degree matrix, in
                    144:   --   the range i1..i2.  The coefficient vector gets sorted along.
                    145:
                    146:     ind,min : natural;
                    147:
                    148:   begin
                    149:     for i in i1..i2 loop                  -- sort by swapping minimal element
                    150:       min := deg(i,k);
                    151:       ind := i;
                    152:       for j in i+1..i2 loop               -- search for minimal element
                    153:         if deg(j,k) < min
                    154:          then min := deg(j,k);
                    155:               ind := j;
                    156:         end if;
                    157:       end loop;
                    158:       if ind /= i                         -- swap cff and deg
                    159:        then Swap(cff,deg,i,ind,k);
                    160:       end if;
                    161:     end loop;
                    162:   end Sort;
                    163:
                    164:   procedure Create ( cff : in out Vector; deg : in out Matrix;
                    165:                      i1,i2,k : in natural; ep : out Eval_Poly ) is
                    166:
                    167:   -- DESCRIPTION :
                    168:   --   Returns in ep a nested Horner scheme to evaluate a polynomial given
                    169:   --   in vector/matrix representation with coefficients in cff and degrees
                    170:   --   in deg.  The range being considered is i1..i2, from the kth column.
                    171:
                    172:   -- REQUIRED :
                    173:   --   The entries in the kth column of deg in i1..i2 are sorted
                    174:   --   in increasing order.
                    175:
                    176:     evpr : Eval_Poly_Rep(0..deg(i2,k));
                    177:     ind,j1,j2 : natural;
                    178:
                    179:   begin
                    180:     Initialize(evpr);
                    181:     if k = deg'last(2)                            -- polynomial in one unknown
                    182:      then for i in i1..i2 loop
                    183:             declare
                    184:               pr : Poly_Rec(Coefficient);
                    185:             begin
                    186:               Copy(cff(i),pr.c);
                    187:               evpr(deg(i,k)) := pr;
                    188:             end;
                    189:           end loop;
                    190:      else ind := i1;                              -- recursive call
                    191:           while ind <= i2 loop
                    192:             j1 := ind; j2 := ind;
                    193:             while j2 < i2 and then deg(j1,k) = deg(j2+1,k) loop
                    194:               j2 := j2 + 1;
                    195:             end loop;
                    196:             declare
                    197:               pr : Poly_Rec(Polynomial);
                    198:             begin
                    199:               Sort(cff,deg,j1,j2,k+1);
                    200:               Create(cff,deg,j1,j2,k+1,pr.p);
                    201:               evpr(deg(ind,k)) := pr;
                    202:             end;
                    203:             ind := j2+1;
                    204:           end loop;
                    205:     end if;
                    206:     ep := new Eval_Poly_Rep'(evpr);
                    207:   end Create;
                    208:
                    209: -- CONSTRUCTORS :
                    210:
                    211:   function Create ( p : Poly; n : natural; d : integer ) return Eval_Poly is
                    212:
                    213:   -- DESCRIPTION :
                    214:   --   An evaluable polynomial is returned for p, with d = Maximal_Degree(p,x1)
                    215:   --   and n = Number_of_Unknowns(p) >= 1.
                    216:
                    217:     res : Eval_Poly;
                    218:     evpr : Eval_Poly_Rep(0..d);
                    219:     terms : array(0..d) of Poly := (0..d => Null_Poly);
                    220:
                    221:     procedure Add_Term1 ( t : in Term; cont : out boolean ) is
                    222:
                    223:       pr : Poly_Rec(coefficient);
                    224:
                    225:     begin
                    226:       copy(t.cf,pr.c);
                    227:       evpr(t.dg(t.dg'first)) := pr;
                    228:       cont := true;
                    229:     end Add_Term1;
                    230:     procedure Add_Terms1 is new Visiting_Iterator(Add_Term1);
                    231:
                    232:     procedure Add_Term ( t : in Term; cont : out boolean ) is
                    233:
                    234:       nt : Term;
                    235:
                    236:     begin
                    237:       nt.cf := t.cf;
                    238:       nt.dg := new Standard_Integer_Vectors.Vector(t.dg'first..t.dg'last-1);
                    239:       for i in nt.dg'range loop
                    240:         nt.dg(i) := t.dg(i+1);
                    241:       end loop;
                    242:       Clear(nt);
                    243:       Add(terms(t.dg(t.dg'first)),nt);
                    244:       cont := true;
                    245:     end Add_Term;
                    246:     procedure Add_Terms is new Visiting_Iterator(Add_Term);
                    247:
                    248:   begin
                    249:     Initialize(evpr);
                    250:     if n = 1
                    251:      then Add_Terms1(p);
                    252:      else Add_Terms(p);
                    253:           for i in terms'range loop
                    254:             declare
                    255:               pr : Poly_Rec(polynomial);
                    256:             begin
                    257:               pr.p := Create(terms(i));
                    258:               evpr(i) := pr;
                    259:               Clear(terms(i));
                    260:             end;
                    261:           end loop;
                    262:     end if;
                    263:     res := new Eval_Poly_Rep'(evpr);
                    264:     return res;
                    265:   end Create;
                    266:
                    267:   function Create ( p : Poly; n,nb : natural; d : integer )
                    268:                   return Eval_Coeff_Poly is
                    269:
                    270:   -- DESCRIPTION :
                    271:   --   An evaluable polynomial is returned for p, with d = Maximal_Degree(p,x1),
                    272:   --   n = Number_of_Unknowns(p) >= 1 and nb = Number_of_Terms(p).
                    273:   --   The coefficients of p are converted natural numbers.
                    274:
                    275:     res : Eval_Coeff_Poly;
                    276:     evpr : Eval_Coeff_Poly_Rep(0..d);
                    277:     terms : array(0..d) of Poly := (0..d => Null_Poly);
                    278:
                    279:     procedure Add_Term1 ( t : in Term; cont : out boolean ) is
                    280:
                    281:       pr : Coeff_Poly_Rec(coefficient);
                    282:
                    283:     begin
                    284:       pr.c := Convert(t.cf,nb);
                    285:       evpr(t.dg(t.dg'first)) := pr;
                    286:       cont := true;
                    287:     end Add_Term1;
                    288:     procedure Add_Terms1 is new Visiting_Iterator(Add_Term1);
                    289:
                    290:     procedure Add_Term ( t : in Term; cont : out boolean ) is
                    291:
                    292:       nt : Term;
                    293:
                    294:     begin
                    295:       nt.cf := t.cf;
                    296:       nt.dg := new Standard_Integer_Vectors.Vector(t.dg'first..t.dg'last-1);
                    297:       for i in nt.dg'range loop
                    298:         nt.dg(i) := t.dg(i+1);
                    299:       end loop;
                    300:       Add(terms(t.dg(t.dg'first)),nt);
                    301:       Clear(nt);
                    302:       cont := true;
                    303:     end Add_Term;
                    304:     procedure Add_Terms is new Visiting_Iterator(Add_Term);
                    305:
                    306:   begin
                    307:     Initialize(evpr);
                    308:     if n = 1
                    309:      then for i in evpr'range loop   -- initialization
                    310:             declare
                    311:               nullpr : Coeff_Poly_Rec(polynomial);
                    312:             begin
                    313:               nullpr.p := null;
                    314:               evpr(i) := nullpr;
                    315:             end;
                    316:           end loop;
                    317:           Add_Terms1(p);
                    318:      else Add_Terms(p);
                    319:           for i in terms'range loop
                    320:             declare
                    321:               pr : Coeff_Poly_Rec(polynomial);
                    322:               ind,mdi : integer;
                    323:             begin
                    324:               if terms(i) = Null_Poly
                    325:                then pr.p := null;
                    326:                else ind := Head_Term(terms(i)).dg'first;
                    327:                     mdi := Maximal_Degree(terms(i),ind);
                    328:                     pr.p := Create(terms(i),n-1,nb,mdi);
                    329:               end if;
                    330:               evpr(i) := pr;
                    331:               Clear(terms(i));
                    332:             end;
                    333:           end loop;
                    334:     end if;
                    335:     res := new Eval_Coeff_Poly_Rep'(evpr);
                    336:     return res;
                    337:   end Create;
                    338:
                    339:   function Create ( p : Poly ) return Eval_Poly is
                    340:
                    341:     res : Eval_Poly;
                    342:     nbvar : constant natural := Number_of_Unknowns(p);
                    343:     nbtms : constant natural := Number_of_Terms(p);
                    344:     cff : Vector(1..nbtms);
                    345:     deg : Matrix(1..nbtms,1..nbvar);
                    346:
                    347:   begin
                    348:     if (p = Null_Poly) or else (nbvar = 0)
                    349:      then return null;
                    350:      else Initialize(p,cff,deg);
                    351:           Sort(cff,deg,1,nbtms,1);
                    352:           Create(cff,deg,1,nbtms,1,res);
                    353:           Clear(cff);
                    354:           return res;
                    355:     end if;
                    356:   end Create;
                    357:
                    358:   function Create ( p : Poly ) return Eval_Coeff_Poly is
                    359:
                    360:     res : Eval_Coeff_Poly;
                    361:     lp : Poly := Null_Poly;
                    362:     n : constant natural := Number_of_Unknowns(p);
                    363:     nb : constant natural := Number_of_Terms(p);
                    364:     cnt : natural := 0;
                    365:     ind : integer;
                    366:
                    367:     procedure Label_Term ( t : in Term; cont : out boolean ) is
                    368:
                    369:       lt : Term;
                    370:
                    371:     begin
                    372:       cnt := cnt + 1;
                    373:       lt.cf := Create(cnt);
                    374:       lt.dg := new Standard_Integer_Vectors.Vector'(t.dg.all);
                    375:       Add(lp,lt);
                    376:       Clear(lt);
                    377:       cont := true;
                    378:     end Label_Term;
                    379:     procedure Label_Terms is new Visiting_Iterator(Label_Term);
                    380:
                    381:   begin
                    382:     if (p = Null_Poly) or else (nb = 0)
                    383:      then return null;
                    384:      else Label_Terms(p);
                    385:           ind := Head_Term(p).dg'first;
                    386:           res := Create(lp,n,nb,Maximal_Degree(p,ind));
                    387:           Clear(lp);
                    388:     end if;
                    389:     return res;
                    390:   end Create;
                    391:
                    392:   procedure Diff ( p : in Poly; i : in integer;
                    393:                    cp : out Eval_Coeff_Poly; m : out Vector ) is
                    394:
                    395:     nb : constant natural := Number_of_Terms(p);
                    396:     n : constant natural := Number_of_Unknowns(p);
                    397:     ind,cnt : integer;
                    398:     dp : Poly := Null_Poly;
                    399:
                    400:     procedure Diff_Term ( t : in Term; cont : out boolean ) is
                    401:
                    402:       dt : Term;
                    403:
                    404:     begin
                    405:       cnt := cnt + 1;
                    406:       if t.dg(i) > 0
                    407:        then dt.cf := Create(cnt);
                    408:             dt.dg := new Standard_Integer_Vectors.Vector'(t.dg.all);
                    409:             m(cnt) := Create(t.dg(i));
                    410:             dt.dg(i) := dt.dg(i) - 1;
                    411:             Add(dp,dt);
                    412:             Clear(dt);
                    413:        else m(cnt) := Create(0);
                    414:       end if;
                    415:       cont := true;
                    416:     end Diff_Term;
                    417:     procedure Diff_Terms is new Visiting_Iterator(Diff_Term);
                    418:
                    419:   begin
                    420:     cnt := 0;
                    421:     Diff_Terms(p);
                    422:     if dp /= Null_Poly
                    423:      then ind := Head_Term(dp).dg'first;
                    424:           cp := Create(dp,n,nb,Maximal_Degree(dp,ind));
                    425:     end if;
                    426:   end Diff;
                    427:
                    428:   function Coeff ( p : Poly ) return Vector is
                    429:
                    430:     res : Vector(1..Number_of_Terms(p));
                    431:     cnt : natural := 0;
                    432:
                    433:     procedure Collect_Term ( t : in Term; cont : out boolean ) is
                    434:     begin
                    435:       cnt := cnt + 1;
                    436:       copy(t.cf,res(cnt));
                    437:       cont := true;
                    438:     end Collect_Term;
                    439:     procedure Collect_Terms is new Visiting_Iterator(Collect_Term);
                    440:
                    441:   begin
                    442:     Collect_Terms(p);
                    443:     return res;
                    444:   end Coeff;
                    445:
                    446: -- EVALUATORS :
                    447:
                    448:   function Eval ( p : Poly; x : number; i : integer ) return Poly is
                    449:
                    450:     res : Poly := Null_Poly;
                    451:
                    452:     procedure Eval_Term ( t : in Term; cont : out boolean ) is
                    453:
                    454:       nt : Term;
                    455:
                    456:     begin
                    457:       copy(t.cf,nt.cf);
                    458:       nt.dg := new Standard_Integer_Vectors.Vector(t.dg'first..t.dg'last-1);
                    459:       for j in t.dg'range loop
                    460:         if j < i
                    461:          then nt.dg(j) := t.dg(j);
                    462:          elsif j > i
                    463:              then nt.dg(j-1) := t.dg(j);
                    464:              else for k in 1..t.dg(i) loop
                    465:                     Mul(nt.cf,x);
                    466:                   end loop;
                    467:         end if;
                    468:       end loop;
                    469:       Add(res,nt);
                    470:       Clear(nt);
                    471:       cont := true;
                    472:     end Eval_Term;
                    473:     procedure Eval_Terms is new Visiting_Iterator(Eval_Term);
                    474:
                    475:   begin
                    476:     Eval_Terms(p);
                    477:     return res;
                    478:   end Eval;
                    479:
                    480:   function Eval ( d : Degrees; c : number; x : Vector ) return number is
                    481:
                    482:     res : number;
                    483:
                    484:   begin
                    485:     copy(c,res);
                    486:     for i in d'range loop
                    487:       for j in 1..(-d(i)) loop
                    488:         Div(res,x(i));
                    489:       end loop;
                    490:       for j in 1..d(i) loop
                    491:         Mul(res,x(i));
                    492:       end loop;
                    493:     end loop;
                    494:     return res;
                    495:   end Eval;
                    496:
                    497:   function Eval ( t : Term; x : Vector ) return number is
                    498:   begin
                    499:     return Eval(t.dg,t.cf,x);
                    500:   end Eval;
                    501:
                    502:   function Eval ( t : Term; c : number; x : Vector ) return number is
                    503:   begin
                    504:     return Eval(t.dg,c,x);
                    505:   end Eval;
                    506:
                    507:   function Eval ( p : Poly; x : Vector ) return number is
                    508:
                    509:     res : number;
                    510:
                    511:     procedure Eval_Term ( t : in Term; cont : out boolean ) is
                    512:
                    513:       tmp : number := Eval(t,x);
                    514:
                    515:     begin
                    516:       Add(res,tmp);
                    517:       Clear(tmp);
                    518:       cont := true;
                    519:     end Eval_Term;
                    520:     procedure Eval_Terms is new Visiting_Iterator(Eval_Term);
                    521:
                    522:   begin
                    523:     Copy(zero,res);
                    524:     Eval_Terms(p);
                    525:     return res;
                    526:   end Eval;
                    527:
                    528:   function Eval ( p : Poly; c,x : Vector ) return number is
                    529:
                    530:     res : number;
                    531:     cnt : natural := 0;
                    532:
                    533:     procedure Eval_Term ( t : in Term; cont : out boolean ) is
                    534:
                    535:       tmp : number := Eval(t,c(cnt),x);
                    536:
                    537:     begin
                    538:       cnt := cnt + 1;
                    539:       Add(res,tmp);
                    540:       Clear(tmp);
                    541:       cont := true;
                    542:     end Eval_Term;
                    543:     procedure Eval_Terms is new Visiting_Iterator(Eval_Term);
                    544:
                    545:   begin
                    546:     Copy(zero,res);
                    547:     Eval_Terms(p);
                    548:     return res;
                    549:   end Eval;
                    550:
                    551:   function Eval ( vp : Eval_Poly_Rep; x : Vector; i : integer ) return number;
                    552:
                    553:   function Eval ( vprec : Poly_Rec; x : Vector; i : integer ) return number is
                    554:
                    555:     res : number;
                    556:
                    557:   begin
                    558:     if vprec.k = coefficient
                    559:      then copy(vprec.c,res);
                    560:           return res;
                    561:      elsif vprec.p = null
                    562:          then copy(zero,res);
                    563:               return res;
                    564:          else return Eval(vprec.p.all,x,i);
                    565:     end if;
                    566:   end Eval;
                    567:
                    568:   function Eval ( vp : Eval_Poly_Rep; x : Vector; i : integer ) return number is
                    569:
                    570:     deg : natural := vp'length-1;
                    571:     res : number;
                    572:
                    573:   begin
                    574:     if deg = 0
                    575:      then return Eval(vp(0),x,i+1);
                    576:      else res := Eval(vp(deg),x,i+1);
                    577:           for j in reverse 0..(deg-1) loop
                    578:             Mul(res,x(i));
                    579:             if (vp(j).k = coefficient) or else (vp(j).p /= null)
                    580:              then declare
                    581:                     temp : number := Eval(vp(j),x,i+1);
                    582:                   begin
                    583:                     Add(res,temp);
                    584:                     Clear(temp);
                    585:                   end;
                    586:             end if;
                    587:           end loop;
                    588:           return res;
                    589:     end if;
                    590:   end Eval;
                    591:
                    592:   function Eval ( p : Eval_Poly; x : Vector ) return number is
                    593:   begin
                    594:     if p = null
                    595:      then declare
                    596:             res : number;
                    597:           begin
                    598:             Copy(zero,res);
                    599:             return res;
                    600:           end;
                    601:      else return Eval(p.all,x,x'first);
                    602:     end if;
                    603:   end Eval;
                    604:
                    605:   function Eval ( vp : Eval_Coeff_Poly_Rep; c,x : Vector; i : integer )
                    606:                 return number;
                    607:
                    608:   function Eval ( vprec : Coeff_Poly_Rec; c,x : Vector; i : integer )
                    609:                 return number is
                    610:
                    611:     res : number;
                    612:
                    613:   begin
                    614:     if vprec.k = coefficient
                    615:      then copy(c(vprec.c),res);
                    616:           return res;
                    617:      elsif vprec.p = null
                    618:          then copy(zero,res);
                    619:               return res;
                    620:          else return Eval(vprec.p.all,c,x,i);
                    621:     end if;
                    622:   end Eval;
                    623:
                    624:   function Eval ( vp : Eval_Coeff_Poly_Rep; c,x : Vector; i : integer )
                    625:                 return number is
                    626:
                    627:     deg : natural := vp'length-1;
                    628:     res : number;
                    629:
                    630:   begin
                    631:     if deg = 0
                    632:      then return Eval(vp(0),c,x,i+1);
                    633:      else res := Eval(vp(deg),c,x,i+1);
                    634:           for j in reverse 0..(deg-1) loop
                    635:             Mul(res,x(i));
                    636:             if (vp(j).k = coefficient) or else (vp(j).p /= null)
                    637:              then declare
                    638:                     temp : number := Eval(vp(j),c,x,i+1);
                    639:                   begin
                    640:                     Add(res,temp);
                    641:                     Clear(temp);
                    642:                   end;
                    643:             end if;
                    644:           end loop;
                    645:           return res;
                    646:     end if;
                    647:   end Eval;
                    648:
                    649:   function Eval ( p : Eval_Coeff_Poly; c,x : Vector ) return number is
                    650:   begin
                    651:     if p = null
                    652:      then declare
                    653:             res : number;
                    654:           begin
                    655:             Copy(zero,res);
                    656:             return res;
                    657:           end;
                    658:      else return Eval(p.all,c,x,x'first);
                    659:     end if;
                    660:   end Eval;
                    661:
                    662: -- DESTRUCTORS :
                    663:
                    664:   procedure Clear ( p : in out Eval_Poly ) is
                    665:   begin
                    666:     if p /= null
                    667:      then declare
                    668:             vp : Eval_Poly_Rep renames p.all;
                    669:           begin
                    670:             for i in vp'range loop
                    671:               if vp(i).k = coefficient
                    672:                then Clear(vp(i).c);
                    673:                else Clear(vp(i).p);
                    674:               end if;
                    675:             end loop;
                    676:           end;
                    677:           free(p);
                    678:     end if;
                    679:   end Clear;
                    680:
                    681:   procedure Clear ( p : in out Eval_Coeff_Poly ) is
                    682:   begin
                    683:     if p /= null
                    684:      then declare
                    685:             vp : Eval_Coeff_Poly_Rep renames p.all;
                    686:           begin
                    687:             for i in vp'range loop
                    688:               if vp(i).k /= coefficient
                    689:                then Clear(vp(i).p);
                    690:               end if;
                    691:             end loop;
                    692:           end;
                    693:           free(p);
                    694:     end if;
                    695:   end Clear;
                    696:
                    697: end Generic_Laur_Poly_Functions;

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