
(*   Algebraizacija projektivne ravnine   *)

(*   Vedran Krcadinac, Travanj 1996.  *)

(*   Varijabli Ravnina treba pridruziti projektivnu ravninu, 
     a varijabli Red njezin red                               *)


(*  Ako se projektivna ravnina konstruira pomocu paketa FinitePlanes.m
    ili HughesPlanes.m ovo je definicija za Red:                        *)

Red := FFOrder


(* Osnovne operacije u Ravnini *)

Sijeci[a_,b_] := 
  If[a==b,Message[Sijeci::isti]; $Failed, 
          Intersection[Ravnina[[a]],Ravnina[[b]]][[1]]] 

Sijeci::isti = 
  "Pokusaj sijecenja pravca sa samim sobom."

Spoji[A_,B_] :=
  If[A==B,Message[Spoji::isti]; $Failed,
          Position[Ravnina, x_ /; MemberQ[x,A] && MemberQ[x,B],{1}][[1,1]]]

Spoji::isti =
  "Pokusaj spajanja tocke sa samom sobom."

Niz[a_] := Ravnina[[a]]

Pramen[A_] := Flatten[Position[Ravnina, x_ /; MemberQ[x,A],{1}]]

    
(* Definicjia zbrajanja *)

Zbrajanje[x_,N_,O_,I_,P_,S_] :=
  Module[{elementi,Q,R,i,j},
         elementi = Join[{O,I},Complement[Niz[x],{N,O,I}]];
         Clear[FFPlus];
         Table[ Q = Sijeci[Spoji[N,P],Spoji[elementi[[j+1]],S]];
                R = Sijeci[Spoji[N,S],Spoji[elementi[[i+1]],P]];
                FFPlus[i,j] = 
                  Position[elementi,Sijeci[Spoji[Q,R],x]][[1,1]]-1,
               {i,0,Red-1},{j,0,Red-1}
              ]
        ]

Zbrajanje[x_,N_,O_,I_] :=
  Module[{c,P,S},
	 c = Complement[Pramen[O],{x}][[1]];
	 P = Complement[Niz[c],{O}][[1]];
	 S = Complement[Niz[c],{O}][[2]];
	 Zbrajanje[x,N,O,I,P,S]
        ]

Mnozenje[x_,N_,O_,I_,P_,S_] :=
  Module[{elementi,Q,R,i,j},
	 elementi = Prepend[Complement[Niz[x],{N,O,I}],I];
	 Clear[FFTimes];
	 Do[FFTimes[0,i]=FFTimes[i,0]=0,{i,0,Red-1}];
	 Table[ Q = Sijeci[Spoji[O,S],Spoji[elementi[[j]],P]];
		R = Sijeci[Spoji[N,P],Spoji[elementi[[i]],S]];
		FFTimes[i,j] = Position[elementi,Sijeci[x,Spoji[Q,R]]][[1,1]],
		{i,1,Red-1},{j,1,Red-1}
              ]
        ]

Mnozenje[x_,N_,O_,I_] :=
  Module[{c,P,S},
	 c = Complement[Pramen[I],{x}][[1]];
	 P = Complement[Niz[c],{I}][[1]];
	 S = Complement[Niz[c],{I}][[2]];
	 Mnozenje[x,N,O,I,P,S]
        ] 
