[BACK]Return to permute_operations.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Symmetry

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/permute_operations.adb, Revision 1.1

1.1     ! maekawa     1: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
        !             2:
        !             3: package body Permute_Operations is
        !             4:
        !             5:   function "*" ( p : Permutation; v : Standard_Natural_Vectors.Vector )
        !             6:               return Standard_Natural_Vectors.Vector is
        !             7:
        !             8:     r : Standard_Natural_Vectors.Vector(v'range);
        !             9:
        !            10:   begin
        !            11:     for i in p'range loop
        !            12:       if p(i) >= 0
        !            13:        then r(i) := v(p(i));
        !            14:        else r(i) := -v(-p(i));
        !            15:       end if;
        !            16:     end loop;
        !            17:     return r;
        !            18:   end "*";
        !            19:
        !            20:   function "*" ( p : Permutation; v : Standard_Integer_Vectors.Vector )
        !            21:               return Standard_Integer_Vectors.Vector is
        !            22:
        !            23:     r : Standard_Integer_Vectors.Vector(v'range);
        !            24:
        !            25:   begin
        !            26:     for i in p'range loop
        !            27:       if p(i) >= 0
        !            28:        then r(i) := v(p(i));
        !            29:        else r(i) := -v(-p(i));
        !            30:       end if;
        !            31:     end loop;
        !            32:     return r;
        !            33:   end "*";
        !            34:
        !            35:   function "*" ( p : Permutation; v : Standard_Floating_Vectors.Vector )
        !            36:                return Standard_Floating_Vectors.Vector is
        !            37:
        !            38:     r : Standard_Floating_Vectors.Vector(v'range);
        !            39:
        !            40:   begin
        !            41:     for i in p'range loop
        !            42:       if p(i) >= 0
        !            43:        then r(i) := v(p(i));
        !            44:        else r(i) := -v(-p(i));
        !            45:       end if;
        !            46:     end loop;
        !            47:     return r;
        !            48:   end "*";
        !            49:
        !            50:   function "*" ( p : Permutation; v : Standard_Complex_Vectors.Vector )
        !            51:                return Standard_Complex_Vectors.Vector is
        !            52:
        !            53:     r : Standard_Complex_Vectors.Vector(v'range);
        !            54:
        !            55:   begin
        !            56:     for i in p'range loop
        !            57:       if p(i) >= 0
        !            58:        then r(i) := v(p(i));
        !            59:        else r(i) := -v(-p(i));
        !            60:       end if;
        !            61:     end loop;
        !            62:     return r;
        !            63:   end "*";
        !            64:
        !            65:   function Permutable ( v1,v2 : Standard_Natural_Vectors.Vector )
        !            66:                       return boolean is
        !            67:   begin
        !            68:     if v1'first /= v2'first or else v1'last /= v2'last
        !            69:      then return false;  -- the dimensions must correspond !
        !            70:      else declare
        !            71:             p : Permutation(v1'first..v1'last);
        !            72:           begin
        !            73:             for k in p'range loop
        !            74:               p(k) := 0;
        !            75:               for l in v2'range loop
        !            76:                 if v2(l) = v1(k)
        !            77:                  then p(k) := l;
        !            78:                       for j in 1..(k-1) loop
        !            79:                         if p(j) = l
        !            80:                          then p(k) := 0;
        !            81:                         end if;
        !            82:                       end loop;
        !            83:                 end if;
        !            84:                 exit when p(k) /= 0;
        !            85:               end loop;
        !            86:               if p(k) = 0
        !            87:                then return false;
        !            88:               end if;
        !            89:             end loop;
        !            90:           end;
        !            91:           return true;
        !            92:     end if;
        !            93:   end Permutable;
        !            94:
        !            95:   function Permutable ( v1,v2 : Standard_Integer_Vectors.Vector )
        !            96:                       return boolean is
        !            97:   begin
        !            98:     if v1'first /= v2'first or else v1'last /= v2'last
        !            99:      then return false;  -- the dimensions must correspond !
        !           100:      else declare
        !           101:             p : Permutation(v1'first..v1'last);
        !           102:           begin
        !           103:             for k in p'range loop
        !           104:               p(k) := 0;
        !           105:               for l in v2'range loop
        !           106:                 if v2(l) = v1(k)
        !           107:                  then p(k) := l;
        !           108:                       for j in 1..(k-1) loop
        !           109:                         if p(j) = l
        !           110:                          then p(k) := 0;
        !           111:                         end if;
        !           112:                       end loop;
        !           113:                 end if;
        !           114:                 exit when p(k) /= 0;
        !           115:               end loop;
        !           116:               if p(k) = 0
        !           117:                then return false;
        !           118:               end if;
        !           119:             end loop;
        !           120:           end;
        !           121:           return true;
        !           122:     end if;
        !           123:   end Permutable;
        !           124:
        !           125:   function Permutable ( v1,v2 : Standard_Floating_Vectors.Vector )
        !           126:                       return boolean is
        !           127:   begin
        !           128:     if v1'first /= v2'first or else v1'last /= v2'last
        !           129:      then return false;  -- the dimensions must correspond !
        !           130:      else declare
        !           131:             p : Permutation(v1'first..v1'last);
        !           132:           begin
        !           133:             for k in p'range loop
        !           134:               p(k) := 0;
        !           135:               for l in v2'range loop
        !           136:                 if v2(l) = v1(k)
        !           137:                  then p(k) := l;
        !           138:                       for j in 1..(k-1) loop
        !           139:                         if p(j) = l
        !           140:                          then p(k) := 0;
        !           141:                         end if;
        !           142:                       end loop;
        !           143:                 end if;
        !           144:                 exit when p(k) /= 0;
        !           145:               end loop;
        !           146:               if p(k) = 0
        !           147:                then return false;
        !           148:               end if;
        !           149:             end loop;
        !           150:           end;
        !           151:           return true;
        !           152:     end if;
        !           153:   end Permutable;
        !           154:
        !           155:   function Permutable ( v1,v2 : Standard_Complex_Vectors.Vector )
        !           156:                       return boolean is
        !           157:   begin
        !           158:     if v1'first /= v2'first or else v1'last /= v2'last
        !           159:      then return false;  -- the dimensions must correspond !
        !           160:      else declare
        !           161:             p : Permutation(v1'first..v1'last);
        !           162:           begin
        !           163:             for k in p'range loop
        !           164:               p(k) := 0;
        !           165:               for l in v2'range loop
        !           166:                 if v2(l) = v1(k)
        !           167:                  then p(k) := l;
        !           168:                       for j in 1..(k-1) loop
        !           169:                         if p(j) = l
        !           170:                          then p(k) := 0;
        !           171:                         end if;
        !           172:                       end loop;
        !           173:                 end if;
        !           174:                 exit when p(k) /= 0;
        !           175:               end loop;
        !           176:               if p(k) = 0
        !           177:                then return false;
        !           178:               end if;
        !           179:             end loop;
        !           180:           end;
        !           181:           return true;
        !           182:     end if;
        !           183:   end Permutable;
        !           184:
        !           185:   function Permutable ( v1,v2 : Standard_Floating_Vectors.Vector;
        !           186:                         tol : double_float ) return boolean is
        !           187:   begin
        !           188:     if v1'first /= v2'first or else v1'last /= v2'last
        !           189:      then return false;  -- the dimensions must correspond !
        !           190:      else declare
        !           191:             p : Permutation(v1'first..v1'last);
        !           192:           begin
        !           193:             for k in p'range loop
        !           194:               p(k) := 0;
        !           195:               for l in v2'range loop
        !           196:                 if ABS(v2(l) - v1(k)) <= tol
        !           197:                  then p(k) := l;
        !           198:                       for j in 1..(k-1) loop
        !           199:                         if p(j) = l
        !           200:                          then p(k) := 0;
        !           201:                         end if;
        !           202:                       end loop;
        !           203:                 end if;
        !           204:                 exit when p(k) /= 0;
        !           205:               end loop;
        !           206:               if p(k) = 0
        !           207:                then return false;
        !           208:               end if;
        !           209:             end loop;
        !           210:           end;
        !           211:           return true;
        !           212:     end if;
        !           213:   end Permutable;
        !           214:
        !           215:   function Permutable ( v1,v2 : Standard_Complex_Vectors.Vector;
        !           216:                         tol : double_float ) return boolean is
        !           217:   begin
        !           218:     if v1'first /= v2'first or else v1'last /= v2'last
        !           219:      then return false;  -- the dimensions must correspond !
        !           220:      else declare
        !           221:             p : Permutation(v1'first..v1'last);
        !           222:           begin
        !           223:             for k in p'range loop
        !           224:               p(k) := 0;
        !           225:               for l in v2'range loop
        !           226:                 if (ABS(REAL_PART(v2(l)) - REAL_PART(v1(k))) <= tol)
        !           227:                   and then (ABS(IMAG_PART(v2(l)) - IMAG_PART(v1(k))) <= tol)
        !           228:                  then p(k) := l;
        !           229:                       for j in 1..(k-1) loop
        !           230:                         if p(j) = l
        !           231:                          then p(k) := 0;
        !           232:                         end if;
        !           233:                       end loop;
        !           234:                 end if;
        !           235:                 exit when p(k) /= 0;
        !           236:               end loop;
        !           237:               if p(k) = 0
        !           238:                then return false;
        !           239:               end if;
        !           240:             end loop;
        !           241:           end;
        !           242:           return true;
        !           243:     end if;
        !           244:   end Permutable;
        !           245:
        !           246:   function Sign_Permutable ( v1,v2 : Standard_Natural_Vectors.Vector )
        !           247:                            return boolean is
        !           248:   begin
        !           249:     if v1'first /= v2'first or else v1'last /= v2'last
        !           250:      then return false;  -- the dimensions must correspond !
        !           251:      else declare
        !           252:             p : Permutation(v1'first..v1'last);
        !           253:           begin
        !           254:             for k in p'range loop
        !           255:               p(k) := 0;
        !           256:               for l in v2'range loop
        !           257:                 if v2(l) = v1(k) or else v2(l) = -v1(k)
        !           258:                  then p(k) := l;
        !           259:                       for j in 1..(k-1) loop
        !           260:                         if p(j) = l
        !           261:                          then p(k) := 0;
        !           262:                         end if;
        !           263:                       end loop;
        !           264:                 end if;
        !           265:                 exit when p(k) /= 0;
        !           266:               end loop;
        !           267:               if p(k) = 0
        !           268:                then return false;
        !           269:               end if;
        !           270:             end loop;
        !           271:           end;
        !           272:           return true;
        !           273:     end if;
        !           274:   end Sign_Permutable;
        !           275:
        !           276:   function Sign_Permutable ( v1,v2 : Standard_Integer_Vectors.Vector )
        !           277:                            return boolean is
        !           278:   begin
        !           279:     if v1'first /= v2'first or else v1'last /= v2'last
        !           280:      then return false;  -- the dimensions must correspond !
        !           281:      else declare
        !           282:             p : Permutation(v1'first..v1'last);
        !           283:           begin
        !           284:             for k in p'range loop
        !           285:               p(k) := 0;
        !           286:               for l in v2'range loop
        !           287:                 if v2(l) = v1(k) or else v2(l) = -v1(k)
        !           288:                  then p(k) := l;
        !           289:                       for j in 1..(k-1) loop
        !           290:                         if p(j) = l
        !           291:                          then p(k) := 0;
        !           292:                         end if;
        !           293:                       end loop;
        !           294:                 end if;
        !           295:                 exit when p(k) /= 0;
        !           296:               end loop;
        !           297:               if p(k) = 0
        !           298:                then return false;
        !           299:               end if;
        !           300:             end loop;
        !           301:           end;
        !           302:           return true;
        !           303:     end if;
        !           304:   end Sign_Permutable;
        !           305:
        !           306:   function Sign_Permutable ( v1,v2 : Standard_Floating_Vectors.Vector )
        !           307:                            return boolean is
        !           308:   begin
        !           309:     if v1'first /= v2'first or else v1'last /= v2'last
        !           310:      then return false;  -- the dimensions must correspond !
        !           311:      else declare
        !           312:             p : Permutation(v1'first..v1'last);
        !           313:           begin
        !           314:             for k in p'range loop
        !           315:               p(k) := 0;
        !           316:               for l in v2'range loop
        !           317:                 if v2(l) = v1(k) or else v2(l) = -v1(k)
        !           318:                  then p(k) := l;
        !           319:                       for j in 1..(k-1) loop
        !           320:                         if p(j) = l
        !           321:                          then p(k) := 0;
        !           322:                         end if;
        !           323:                       end loop;
        !           324:                 end if;
        !           325:                 exit when p(k) /= 0;
        !           326:               end loop;
        !           327:               if p(k) = 0
        !           328:                then return false;
        !           329:               end if;
        !           330:             end loop;
        !           331:           end;
        !           332:           return true;
        !           333:     end if;
        !           334:   end Sign_Permutable;
        !           335:
        !           336:   function Sign_Permutable ( v1,v2 : Standard_Complex_Vectors.Vector )
        !           337:                            return boolean is
        !           338:   begin
        !           339:     if v1'first /= v2'first or else v1'last /= v2'last
        !           340:      then return false;  -- the dimensions must correspond !
        !           341:      else declare
        !           342:             p : Permutation(v1'first..v1'last);
        !           343:           begin
        !           344:             for k in p'range loop
        !           345:               p(k) := 0;
        !           346:               for l in v2'range loop
        !           347:                 if v2(l) = v1(k) or else v2(l) = -v1(k)
        !           348:                  then p(k) := l;
        !           349:                       for j in 1..(k-1) loop
        !           350:                         if p(j) = l
        !           351:                          then p(k) := 0;
        !           352:                         end if;
        !           353:                       end loop;
        !           354:                 end if;
        !           355:                 exit when p(k) /= 0;
        !           356:               end loop;
        !           357:               if p(k) = 0
        !           358:                then return false;
        !           359:               end if;
        !           360:             end loop;
        !           361:           end;
        !           362:           return true;
        !           363:     end if;
        !           364:   end Sign_Permutable;
        !           365:
        !           366:   function Sign_Permutable ( v1,v2 : Standard_Floating_Vectors.Vector;
        !           367:                              tol : double_float ) return boolean is
        !           368:   begin
        !           369:     if v1'first /= v2'first or else v1'last /= v2'last
        !           370:      then return false;  -- the dimensions must correspond !
        !           371:      else declare
        !           372:             p : Permutation(v1'first..v1'last);
        !           373:           begin
        !           374:             for k in p'range loop
        !           375:               p(k) := 0;
        !           376:               for l in v2'range loop
        !           377:                 if (ABS(v2(l) - v1(k)) <= tol)
        !           378:                    or else  (ABS(v2(l) + v1(k)) <= tol)
        !           379:                  then p(k) := l;
        !           380:                       for j in 1..(k-1) loop
        !           381:                         if p(j) = l
        !           382:                          then p(k) := 0;
        !           383:                         end if;
        !           384:                       end loop;
        !           385:                 end if;
        !           386:                 exit when p(k) /= 0;
        !           387:               end loop;
        !           388:               if p(k) = 0
        !           389:                then return false;
        !           390:               end if;
        !           391:             end loop;
        !           392:           end;
        !           393:           return true;
        !           394:     end if;
        !           395:   end Sign_Permutable;
        !           396:
        !           397:   function Sign_Permutable ( v1,v2 : Standard_Complex_Vectors.Vector;
        !           398:                              tol : double_float ) return boolean is
        !           399:   begin
        !           400:     if v1'first /= v2'first or else v1'last /= v2'last
        !           401:      then return false;  -- the dimensions must correspond !
        !           402:      else declare
        !           403:             p : Permutation(v1'first..v1'last);
        !           404:           begin
        !           405:             for k in p'range loop
        !           406:               p(k) := 0;
        !           407:               for l in v2'range loop
        !           408:                 if ((ABS(REAL_PART(v2(l)) - REAL_PART(v1(k))) <= tol)
        !           409:                     and then (ABS(IMAG_PART(v2(l)) - IMAG_PART(v1(k))) <= tol))
        !           410:                   or else ((ABS(REAL_PART(v2(l)) + REAL_PART(v1(k))) <= tol)
        !           411:                     and then (ABS(IMAG_PART(v2(l)) + IMAG_PART(v1(k))) <= tol))
        !           412:                  then p(k) := l;
        !           413:                       for j in 1..(k-1) loop
        !           414:                         if p(j) = l
        !           415:                          then p(k) := 0;
        !           416:                         end if;
        !           417:                       end loop;
        !           418:                 end if;
        !           419:                 exit when p(k) /= 0;
        !           420:               end loop;
        !           421:               if p(k) = 0
        !           422:                then return false;
        !           423:               end if;
        !           424:             end loop;
        !           425:           end;
        !           426:           return true;
        !           427:     end if;
        !           428:   end Sign_Permutable;
        !           429:
        !           430:   function "*" ( p : Permutation; t : Standard_Complex_Polynomials.Term )
        !           431:                return Standard_Complex_Polynomials.Term is
        !           432:
        !           433:     res : Standard_Complex_Polynomials.Term;
        !           434:
        !           435:   begin
        !           436:     res.cf := t.cf;
        !           437:     res.dg := new Standard_Natural_Vectors.Vector(t.dg'range);
        !           438:     for i in p'range loop
        !           439:       if p(i) >= 0
        !           440:        then res.dg(i) := t.dg(p(i));
        !           441:        else res.dg(i) := t.dg(-p(i));
        !           442:             res.cf := -res.cf;
        !           443:       end if;
        !           444:     end loop;
        !           445:     return res;
        !           446:   end "*";
        !           447:
        !           448:   function "*" ( p : Permutation; s : Standard_Complex_Polynomials.Poly )
        !           449:                return Standard_Complex_Polynomials.Poly is
        !           450:
        !           451:     use Standard_Complex_Polynomials;
        !           452:     res : Poly := Null_Poly;
        !           453:
        !           454:     procedure Permute_Term ( t : in Term; continue : out boolean ) is
        !           455:       tt : Term := p*t;
        !           456:     begin
        !           457:       Add(res,tt);
        !           458:       Clear(tt);
        !           459:       continue := true;
        !           460:     end Permute_Term;
        !           461:     procedure Permute_Terms is new Visiting_Iterator(Permute_Term);
        !           462:
        !           463:   begin
        !           464:     Permute_Terms(s);
        !           465:     return res;
        !           466:   end "*";
        !           467:
        !           468:   function "*" ( p : Permutation; t : Standard_Complex_Laur_Polys.Term )
        !           469:                return Standard_Complex_Laur_Polys.Term is
        !           470:
        !           471:     res : Standard_Complex_Laur_Polys.Term;
        !           472:
        !           473:   begin
        !           474:     res.cf := t.cf;
        !           475:     res.dg := new Standard_Integer_Vectors.Vector(t.dg'range);
        !           476:     for i in p'range loop
        !           477:       if p(i) >= 0
        !           478:        then res.dg(i) := t.dg(p(i));
        !           479:        else res.dg(i) := t.dg(-p(i));
        !           480:             res.cf := -res.cf;
        !           481:       end if;
        !           482:     end loop;
        !           483:     return res;
        !           484:   end "*";
        !           485:
        !           486:   function "*" ( p : Permutation; s : Standard_Complex_Laur_Polys.Poly )
        !           487:                return Standard_Complex_Laur_Polys.Poly is
        !           488:
        !           489:     use Standard_Complex_Laur_Polys;
        !           490:     res : Poly := Null_Poly;
        !           491:
        !           492:     procedure Permute_Term ( t : in Term; continue : out boolean ) is
        !           493:
        !           494:       tt : Term := p*t;
        !           495:
        !           496:     begin
        !           497:       Add(res,tt);
        !           498:       Clear(tt);
        !           499:       continue := true;
        !           500:     end Permute_Term;
        !           501:     procedure Permute_Terms is new Visiting_Iterator(Permute_Term);
        !           502:
        !           503:   begin
        !           504:     Permute_Terms(s);
        !           505:     return res;
        !           506:   end "*";
        !           507:
        !           508:   function "*" ( s : Poly_Sys; p : Permutation ) return Poly_Sys is
        !           509:
        !           510:     res : Poly_Sys(s'range);
        !           511:
        !           512:   begin
        !           513:     for k in res'range loop
        !           514:       res(k) := p*s(k);
        !           515:     end loop;
        !           516:     return res;
        !           517:   end "*";
        !           518:
        !           519:   function "*" ( s : Laur_Sys; p : Permutation ) return Laur_Sys is
        !           520:
        !           521:     res : Laur_Sys(s'range);
        !           522:
        !           523:   begin
        !           524:     for k in res'range loop
        !           525:       res(k) := p*s(k);
        !           526:     end loop;
        !           527:     return res;
        !           528:   end "*";
        !           529:
        !           530:   function "*" ( p : Permutation; s : Poly_Sys ) return Poly_Sys is
        !           531:
        !           532:     r : Poly_Sys(s'range);
        !           533:     use Standard_Complex_Polynomials;
        !           534:
        !           535:   begin
        !           536:     for i in p'range loop
        !           537:       if p(i) >= 0
        !           538:        then Copy(s(p(i)),r(i));
        !           539:        else r(i) := -s(-p(i));
        !           540:       end if;
        !           541:     end loop;
        !           542:     return r;
        !           543:   end "*";
        !           544:
        !           545:   function "*" ( p : Permutation; s : Laur_Sys ) return Laur_Sys is
        !           546:
        !           547:     r : Laur_Sys(s'range);
        !           548:     use Standard_Complex_Laur_Polys;
        !           549:
        !           550:   begin
        !           551:     for i in p'range loop
        !           552:       if p(i) >= 0
        !           553:        then Copy(s(p(i)),r(i));
        !           554:        else r(i) := -s(-p(i));
        !           555:       end if;
        !           556:     end loop;
        !           557:     return r;
        !           558:   end "*";
        !           559:
        !           560: end Permute_Operations;

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