[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     ! 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>