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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/equivariant_polynomial_systems.adb, Revision 1.1.1.1

1.1       maekawa     1: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
                      2: with Permutations,Permute_Operations;    use Permutations,Permute_Operations;
                      3:
                      4: package body Equivariant_Polynomial_Systems is
                      5:
                      6:   procedure Act ( v : in List_of_Permutations; s : in Poly_Sys;
                      7:                   w : in out List_of_Permutations;
                      8:                   fail,inva,equi : out boolean ) is
                      9:
                     10:     min_s : Poly_Sys(s'range);
                     11:     last_w : List_of_Permutations;
                     12:     wrkinva,wrkequi : boolean;
                     13:
                     14:     procedure Process ( p : in Permutation; cont : in out boolean ) is
                     15:
                     16:       ps : Poly; -- the permuted polynomial
                     17:       pp : Permutation(p'range);
                     18:
                     19:     begin
                     20:       for i in s'range loop
                     21:         ps := p*s(i);
                     22:         pp(i) := p'last+1;
                     23:         for j in s'range loop
                     24:           if Equal(ps,s(j))
                     25:            then pp(i) := j;
                     26:            elsif Equal(ps,min_s(j))
                     27:                then pp(i) := -j;
                     28:           end if;
                     29:         end loop;
                     30:         if pp(i) = p'last+1
                     31:          then fail := true;
                     32:         end if;
                     33:         Clear(ps);
                     34:       end loop;
                     35:       if wrkinva
                     36:        then for j in pp'range loop
                     37:               wrkinva := (pp(j) = j);
                     38:               exit when not wrkinva;
                     39:             end loop;
                     40:       end if;
                     41:       if wrkequi
                     42:        then wrkequi := Equal(pp,p);
                     43:       end if;
                     44:       Append(w,last_w,pp);
                     45:       cont := true;
                     46:     end Process;
                     47:     procedure Act_of_Permutations is new Iterator(Process);
                     48:
                     49:   begin
                     50:     min_s := -s;
                     51:     fail := false;
                     52:     wrkinva := true; wrkequi := true;
                     53:     Act_of_Permutations(v);
                     54:     inva := wrkinva; equi := wrkequi;
                     55:     Clear(min_s);
                     56:   end Act;
                     57:
                     58:   function Symmetric ( s : Poly_Sys; v,w : List_of_Permutations )
                     59:                      return boolean is
                     60:
                     61:     lw,plw,pw : List_of_Permutations;
                     62:     fail,inva,equi : boolean;
                     63:
                     64:   begin
                     65:     Act(v,s,lw,fail,inva,equi);
                     66:     pw := w;
                     67:     plw := lw;
                     68:     while not Is_Null(plw) loop
                     69:       if not Equal(Permutation(Head_Of(plw).all),Permutation(Head_Of(pw).all))
                     70:        then Clear(lw);
                     71:            return false;
                     72:        else plw := Tail_Of(plw);
                     73:            pw := Tail_Of(pw);
                     74:       end if;
                     75:     end loop;
                     76:     Clear(lw);
                     77:     return true;
                     78:   end Symmetric;
                     79:
                     80: end Equivariant_Polynomial_Systems;

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