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>