( Arithmetik in Galois Feldern, Grundkoerper F_p ) : Restklassen ; variable F_pp 2 F_pp ! \ Vorbesetzung mit 2 : F_p+ ( a b -- a+b ) + F_pp @ mod ; : F_p- ( a b -- a-b ) - F_pp @ mod ; : F_p* ( a b -- a*b ) * F_pp @ mod ; : F_p/ ( a b -- a/b ) swap 0 swap ( b 0 a) ( oder b q r ) begin rot dup >r \ q r b /mod \ q r delta-q rot + \ r q r> swap rot dup \ b q r r F_pp @ + swap \ b q r' r 0= until drop swap drop ; \ Einrichtung des gesonderten F_p^n Stapels entfaellt hier \ ************ weil nur fuer F_p^2 ******************* 2 constant F_p^nn F_p^nn cell * constant F_p^2#bytes \ Speicherplatz fuer eine Zahl aus F_p^2 \ -------------------------------------------------------------- \ Arithmetik fuer Galois-Felder F_p^n auf dem Parameterstapel \ nur Spezialfall n=2 und Polynom a^2+a+1=0 \ dieses Polynom ist irreduzibel fuer z. B. p= 2, 5 : F_p^2+ ( a0 a1 b0 b1 -- a0+b0 a1+b1 ) swap >r f_p+ swap r> f_p+ swap ; : F_p^2- ( a0 a1 b0 b1 -- a0-bo a1-b1 ) swap >r f_p- swap r> f_p- swap ; : F_p^2* ( a0 a1 b0 b1 -- c0 c1 ) \ c0 = a0*b0 - a1*b1 \ c1 = a1*b0 + a0*b1 - a1*b1 dup >r swap dup >r \ a0 a1 b1 b0 |R b0 b1 rot dup >r f_p* \ a0 b1 a1*b0 |R a1 b0 b1 rot dup >r \ b1 a1*b0 a0 |R a0 a1 b0 b1 rot f_p* f_p+ \ a1*b0+a0*b1 |R a0 a1 b0 b1 r> r> r> rot \ a1*b0+a0*b1 a1 b0 a0 |R b1 f_p* swap r> f_p* \ a1*b0+a0*b1 a0*b0 a1*b1 |R dup >r f_p- \ a1*b0+a0*b1 a0*b0-a1*b1 |R a1 b1 swap r> f_p- ; \ a0*b0-a1*b1 a1*b0+a0*b1-a1*b1 |R : konj ( a0 a1 -- a0+a1 a1 ) dup rot f_p+ swap ; \ nur falls Polynom a^2+a+1=0 korrekt : F_p^2/ ( a0 a1 b0 b1 - c0 c1 ) \ aehnlich wie durch Erweiterung mit dem konjugiert komplexen Nenner \ machbar, Als Uebungsaufgabe empfohlen. ; \ ----------------------------------------------------------------- \ Variablen und Konstanten : F_p^2variable create [ F_p^2#bytes ] literal allot ; : F_p^2! dup [ F_p^2#bytes 1- ] literal + swap do i ! 4 +loop ; : F_p^2@ dup 1- swap [ F_p^2#bytes 2 / ] literal + do i @ -4 +loop ; f_p^2variable test