Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  ffe.tst   Sprache: unbekannt

 
Spracherkennung für: .tst vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

#@local Rochambeau,e,F,f1,f2,f3,p,pol,qs,r,x,bigPrime,z,odds,evens
#@local r1,r2,r3,sf1,sf2,sf3,q,q2,Fp,fields,C,coeffs,B
gap> START_TEST("ffe.tst");

#
# setup
#
gap> bigPrime:=NextPrimeInt(2^60);
1152921504606847009

#
# Z, ZOp: constructing FFE elements
#
gap> List([2,3,4,5,7,8,9,25,37^3], Z);
[ Z(2)^0, Z(3), Z(2^2), Z(5), Z(7), Z(2^3), Z(3^2), Z(5^2), Z(37^3) ]

# input validation
gap> Z(fail);
Error, Z: <q> must be a positive prime power (not the value 'fail')
gap> Z(0);
Error, Z: <q> must be a positive prime power (not the integer 0)
gap> Z(1);
Error, Z: <q> must be a positive prime power (not the integer 1)
gap> Z(-2);
Error, Z: <q> must be a positive prime power (not the integer -2)
gap> Z(6);
Error, Z: <q> must be a positive prime power (not the integer 6)
gap> Z(65537*65539);
Error, Z: <q> must be a positive prime power (not the integer 4295229443)

# variant with two arguments
gap> Z(0,1);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `ZOp' on 2 arguments
gap> Z(1,0);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `ZOp' on 2 arguments
gap> Z(2,0);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `ZOp' on 2 arguments
gap> Z(2,1);
Z(2)^0

#
gap> Z(65521,1);
Z(65521)
gap> Z(65521,2);
z
gap> Z(2^16);
Z(2^16)
gap> Z(2,16);
Z(2^16)
gap> Z(bigPrime);
ZmodpZObj( 13, 1152921504606847009 )
gap> Z(bigPrime^2);
z
gap> Z(bigPrime) = Z(bigPrime,1);
true
gap> Z(bigPrime^2) = Z(bigPrime,2);
true

# verify some edge cases which previously were accepted (incorrectly)
gap> Z(6,3);
Error, Z: <p> must be a prime (not the integer 6)
gap> Z(9,1);
Error, Z: <p> must be a prime (not the integer 9)
gap> Z(9,2);
Error, Z: <p> must be a prime (not the integer 9)
gap> Z(2^16,1);
Error, Z: <p> must be a prime (not the integer 65536)
gap> Z(2^16,2);
Error, Z: <p> must be a prime (not the integer 65536)
gap> Z(2^17,1);
Error, Z: <p> must be a prime (not the integer 131072)
gap> Z(2^17,2);
Error, Z: <p> must be a prime (not the integer 131072)

# Invoking Z(p,d) with p not a prime used to crash gap, which we fixed.
# However, invocations like `Z(4,5)` still would erroneously trigger the
# creation of a type object for fields of size p^d (in the example: 1024),
# with the non-prime value p set as characteristic. This could then corrupt
# subsequent computations.
gap> Z(4,5);
Error, Z: <p> must be a prime (not the integer 4)
gap> FieldByGenerators(GF(2), [ Z(1024) ]);
GF(2^10)
gap> Characteristic(Z(1024));
2
gap> Characteristic(FamilyObj(Z(1024)));
2

#
# Constructing finite fields and their subfields
#
gap> GaloisField( 13 );
GF(13)
gap> GaloisField( 5^3 );
GF(5^3)
gap> GaloisField( 7, 2 );
GF(7^2)
gap> GaloisField( GF(4), 2 );
AsField( GF(2^2), GF(2^4) )
gap> x:= Indeterminate( GF(13) );; pol:= x^2 - x - 1;;
gap> GaloisField( 13, pol );
GF(13^2)
gap> GaloisField( GF(13), pol );
GF(13^2)
gap> p:= NextPrimeInt( 3^17 );
129140197
gap> GaloisField( p, 1 );
GF(129140197)
gap> GaloisField( p );
GF(129140197)
gap> AsField( GF(4), GF(16) );
AsField( GF(2^2), GF(2^4) )
gap> x:= Indeterminate( GF(2) );; pol:= x^2 + x + 1;;
gap> FieldExtension( GF(2), pol );
GF(2^2)
gap> FieldExtension( GF(2^3), pol );
AsField( GF(2^3), GF(2^6) )
gap> f1:= GF( 256 );
GF(2^8)
gap> f2:= GF( 2, Z(2) * [1,1,1,0,0,0,0,1,1] );
GF(2^8)
gap> f3:= GF( 2, Z(2) * [1,0,1,1,1,0,0,0,1] );
GF(2^8)

#
gap> GF(1,2,3);
Error, usage: GF( <subfield>, <extension> )
gap> GF(1,2);
Error, <subfield> must be a prime or a finite field

#
gap> FieldByGenerators( GF(2), [ Z(4), Z(8) ] );
GF(2^6)
gap> FieldByGenerators( GF(4), [ Z(4), Z(8) ] );
AsField( GF(2^2), GF(2^6) )
gap> DefaultFieldByGenerators( GF(2), [ Z(4), Z(8) ] );
GF(2^6)
gap> DefaultFieldByGenerators( GF(4), [ Z(4), Z(8) ] );
AsField( GF(2^2), GF(2^12) )
gap> RingByGenerators( [ Z(4), Z(8) ] );
GF(2^6)
gap> RingByGenerators( [ Z(4), Z(8) ] );
GF(2^6)
gap> DefaultRingByGenerators( [ Z(4), Z(8) ] );
GF(2^6)
gap> DefaultRingByGenerators( [ Z(4), Z(8) ] );
GF(2^6)
gap> Subfields( GF(81) );
[ GF(3), GF(3^2), GF(3^4) ]
gap> Subfields( GF(2^6) );
[ GF(2), GF(2^2), GF(2^3), GF(2^6) ]

#
gap> LargeGaloisField(4,1);
Error, LargeGaloisField: Characteristic must be prime
gap> LargeGaloisField(bigPrime);
GF(1152921504606847009)
gap> F:=LargeGaloisField(bigPrime,2);
GF(1152921504606847009^2)
gap> Z(bigPrime,2) = PrimitiveRoot(F);
true

#
# Check that `Coefficients` returns objects of the right type.
#
gap> p:= NextPrimeInt( 10^6 );;
gap> fields:= [ GF(3), GF(3^2), GF(p), LargeGaloisField( p, 2 ) ];;
gap> Fp:= LargeGaloisField( p );;
gap> pol:= UnivariatePolynomial( Fp, [ 912543, 810, 1 ] * One( Fp ) );;
gap> Add( fields, GF( Fp, pol ) );
gap> List( fields, IsFFECollection );
[ true, true, true, true, false ]
gap> List( fields, F -> IsSubset( F, LeftActingDomain( F ) ) );
[ true, true, true, true, false ]
gap> for F in fields do
>      Fp:= LeftActingDomain( F );
>      C:= CanonicalBasis( F );
>      coeffs:= Coefficients( C, One( F ) );
>      if not IsSubset( Fp, coeffs ) then
>        Error( F );
>      fi;
>      B:= Basis( F, BasisVectors( C ) );
>      coeffs:= Coefficients( B, One( F ) );
>      if not IsSubset( Fp, coeffs ) then
>        Error( F );
>      fi;
>      B:= BasisNC( F, BasisVectors( C ) );
>      coeffs:= Coefficients( B, One( F ) );
>      if not IsSubset( Fp, coeffs ) then
>        Error( F );
>      fi;
>    od;

#
# comparing FFEs
#
gap> Z(2) < Z(2); Z(2) < Z(2); Z(2) = Z(2);
false
false
true
gap> Z(2) < 0*Z(2); 0*Z(2) < Z(2); 0*Z(2) = Z(2);
false
true
false
gap> Z(2) < Z(3); Z(3) < Z(2); Z(3) = Z(2); # cross characteristic
true
false
false

#
# test arithmetic
#

# ... in small prime fields
gap> Z(3) * Z(3);
Z(3)^0
gap> Z(3) / Z(3);
Z(3)^0
gap> Z(3) + Z(3);
Z(3)^0
gap> Z(3) - Z(3);
0*Z(3)
gap> Z(3) ^ Z(3);
Z(3)
gap> Z(3)^-1;
Z(3)
gap> (0*Z(3))^-1;
Error, FFE operations: <divisor> must not be zero

# ... in cross characteristic (results in error)
gap> Z(3) * Z(2);
Error, <x> and <y> have different characteristic
gap> Z(3) / Z(2);
Error, <x> and <y> have different characteristic
gap> Z(3) + Z(2);
Error, <x> and <y> have different characteristic
gap> Z(3) - Z(2);
Error, <x> and <y> have different characteristic
gap> Z(3) ^ Z(2);
Error, <x> and <y> have different characteristic

# ... in small non-prime fields
gap> Z(9) * Z(9);
Z(3^2)^2
gap> Z(9) / Z(9);
Z(3)^0
gap> Z(9) + Z(9);
Z(3^2)^5
gap> Z(9) - Z(9);
0*Z(3)
gap> Z(9) ^ Z(9);
Z(3^2)
gap> Z(9)^-1;
Z(3^2)^7
gap> (0*Z(9))^-1;
Error, FFE operations: <divisor> must not be zero

# ... in large prime fields
# TODO

# ... in large non-prime fields over small prime
# TODO

# ... in large non-prime fields over large prime
gap> z:=Z(bigPrime,2);
z
gap> 5^100*z;
879649375121325624z
gap> z*5^100;
879649375121325624z
gap> 5^100 mod bigPrime;
879649375121325624
gap> (5^100 + 5^100*z)/5^100;
1+z

#
# arithmetic between FFEs and rationals
#
gap> odds:=[1, 5/3, 5, (5/3)^100, 5^100];;
gap> evens:=[0, 4/3, 4, (4/3)^100, 4^100];;

#
gap> ForAll(odds, x -> x + Z(2) = 0*Z(2));
true
gap> ForAll(odds, x -> Z(2) + x = 0*Z(2));
true
gap> ForAll(evens, x -> x + Z(2) = Z(2));
true
gap> ForAll(evens, x -> Z(2) + x = Z(2));
true

#
gap> ForAll(odds, x -> x - Z(2) = 0*Z(2));
true
gap> ForAll(odds, x -> Z(2) - x = 0*Z(2));
true
gap> ForAll(evens, x -> x - Z(2) = Z(2));
true
gap> ForAll(evens, x -> Z(2) - x = Z(2));
true

#
gap> ForAll(odds, x -> x * Z(2) = Z(2));
true
gap> ForAll(odds, x -> Z(2) * x = Z(2));
true
gap> ForAll(evens, x -> x * Z(2) = 0*Z(2));
true
gap> ForAll(evens, x -> Z(2) * x = 0*Z(2));
true

#
gap> ForAll(odds, x -> x / Z(2) = Z(2));
true
gap> ForAll(odds, x -> Z(2) / x = Z(2));
true
gap> ForAll(evens, x -> x / Z(2) = 0*Z(2));
true
gap> Z(2) / 0;
Error, FFE operations: <divisor> must not be zero
gap> Z(2) / 2;
Error, FFE operations: <divisor> must not be zero

#
#
#
gap> DefiningPolynomial( f1 );
x_1^8+x_1^4+x_1^3+x_1^2+Z(2)^0
gap> DefiningPolynomial( f2 );
x_1^8+x_1^7+x_1^2+x_1+Z(2)^0
gap> DefiningPolynomial( f3 );
x_1^8+x_1^4+x_1^3+x_1^2+Z(2)^0

#
gap> r1 := RootOfDefiningPolynomial( f1 );
Z(2^8)
gap> r2 := RootOfDefiningPolynomial( f2 );
Z(2^8)^53
gap> r3 := RootOfDefiningPolynomial( f3 );
Z(2^8)
gap> sf1:=Subfield(f1, [r1]);;
gap> SetDefiningPolynomial(sf1, DefiningPolynomial( f1 ));
gap> RootOfDefiningPolynomial(sf1) = r1;
true
gap> sf2:=Subfield(f2, [r2]);;
gap> SetDefiningPolynomial(sf2, DefiningPolynomial( f2 ));
gap> RootOfDefiningPolynomial(sf2) = r2;
true
gap> sf3:=Subfield(f3, [r3]);;
gap> SetDefiningPolynomial(sf3, DefiningPolynomial( f3 ));
gap> RootOfDefiningPolynomial(sf3) = r3;
true

#
gap> Z(4) in GF(8);
false
gap> Z(4) in GF(16);
true

#
gap> Intersection( GF(2^2), GF(2^3) );
GF(2)
gap> Intersection( GF(2^4), GF(2^6) );
GF(2^2)

#
gap> Conjugates( GF(16), Z(4) );
[ Z(2^2), Z(2^2)^2, Z(2^2), Z(2^2)^2 ]
gap> Conjugates( AsField( GF(4), GF(16) ), Z(4) );
[ Z(2^2), Z(2^2) ]
gap> Conjugates( GF(4), GF(4), Z(4) );
[ Z(2^2) ]
gap> Conjugates( AsField( GF(4), GF(4) ), GF(2), Z(4) );
[ Z(2^2), Z(2^2)^2 ]
gap> Conjugates( GF(16), Z(8) );
Error, <z> must lie in <L>

#
gap> Norm( GF(16), Z(4) );
Z(2)^0
gap> Norm( AsField( GF(4), GF(16) ), Z(4) );
Z(2^2)^2
gap> Norm( GF(8), GF(8), Z(8) );
Z(2^3)
gap> Norm( AsField( GF(8), GF(8) ), GF(2), Z(8) );
Z(2)^0
gap> Norm( GF(16), Z(8) );
Error, <z> must lie in <L>

#
gap> Trace( GF(16), Z(4) );
0*Z(2)
gap> Trace( AsField( GF(4), GF(16) ), Z(4) );
0*Z(2)
gap> Trace( GF(4), GF(4), Z(4) );
Z(2^2)
gap> Trace( AsField( GF(4), GF(4) ), GF(2), Z(4) );
Z(2)^0
gap> Trace( GF(16), Z(8) );
Error, <z> must lie in <L>

#
gap> List( AsSSortedList( GF(8) ), Order );
[ 0, 1, 7, 7, 7, 7, 7, 7 ]
gap> Order(Z(bigPrime)) = bigPrime-1;
true
gap> Order(Z(bigPrime,1)) = bigPrime-1;
true
gap> Order(Z(bigPrime,2)) = bigPrime^2-1;
true

#
gap> SquareRoots( GF(2), Z(2) );
[ Z(2)^0 ]
gap> SquareRoots( GF(4), Z(4) );
[ Z(2^2)^2 ]
gap> SquareRoots( GF(3), Z(3) );
[  ]
gap> SquareRoots( GF(3), 0*Z(3) );
[ 0*Z(3) ]
gap> SquareRoots( GF(9), Z(3) );
[ Z(3^2)^2, Z(3^2)^6 ]

#
gap> List( AsSSortedList( GF(7) ), Int );
[ 0, 1, 3, 2, 6, 4, 5 ]
gap> List( AsSSortedList( GF(7) ), IntFFE );
[ 0, 1, 3, 2, 6, 4, 5 ]
gap> List( AsSSortedList( GF(7) ), IntFFESymm );
[ 0, 1, 3, 2, -1, -3, -2 ]
gap> Print(List( AsSSortedList( GF(8) ), String ),"\n");
[ "0*Z(2)", "Z(2)^0", "Z(2^3)", "Z(2^3)^2", "Z(2^3)^3", "Z(2^3)^4", 
  "Z(2^3)^5", "Z(2^3)^6" ]
gap> Int(Z(4));
Error, IntFFE: <z> must lie in prime field
gap> IntFFE(Z(4));
Error, IntFFE: <z> must lie in prime field
gap> IntFFESymm(Z(4));
Error, IntFFE: <z> must lie in prime field

#
gap> DegreeFFE( [Z(2), Z(4)]);
2
gap> DegreeFFE( [[Z(2),Z(8)],[Z(2), Z(4)]]);
6

#
# LogFFE
#
gap> q:=25;; r:=Z(q)^7;; ForAll([0..q-2], i -> LogFFE(r^i,r)=i);
true

# test cases were the elements are (internally) defined in two
# fields, neither of which contains the other (this requires some
# extra work by the kernel to compute a common field)
gap> LogFFE( Z(2^3), Z(2^2) );
fail
gap> LogFFE( Z(2^3)^7, Z(2^2) );
0
gap> q:=2^6;; q2:=2^2;; r:=Z(q2);;
gap> Filtered([0..q-1], i->Z(q)^i in GF(q2))
>  = Filtered([0..q-1], i->LogFFE(Z(q)^i, r) <> fail);
true
gap> q:=5^6;; q2:=5^3;; r:=Z(q2)^11;;
gap> Filtered([0..q-1], i->Z(q)^i in GF(q2))
>  = Filtered([0..q-1], i->LogFFE(Z(q)^i, r) <> fail);
true

# test an issue reported by MN on 2009/10/06, added by AK on 2011/01/16
gap> q:=2^16;; r:=Z(q)^2;; ForAll([0..q-2], i -> LogFFE(r^i,r)=i);
true

# test an edge case on 32 bit systems, where a kernel value could overflow
# (see https://github.com/gap-system/gap/issues/2687)
gap> q:=37^3;; r:=Z(q)^1055;; ForAll([0..q-2], i -> LogFFE(r^i,r)=i);
true

# test the fix for https://github.com/gap-system/gap/issues/3784
gap> ForAll( Primes, p -> LogFFE( Z(p^2)^4, Z(p^2)^2 ) = 2 );
true
gap> ForAll( Primes, p -> p = 2 or LogFFE( Z(p), Z(p^2) ) = p+1 );
true
gap> ForAll( Primes, p -> p = 2 or LogFFE( Z(p^2)^(p+1), Z(p) ) = 1 );
true

# error handling
gap> LogFFE(0*Z(2), Z(2));
Error, LogFFE: <z> must be a nonzero finite field element
gap> LogFFE(Z(2), 0*Z(2));
Error, LogFFE: <r> must be a nonzero finite field element

#
# RootFFE
#
gap> Rochambeau:=function(F)
> local e,i,p,a,r;
>  e:=Elements(F);
>  for i in [1..2*Size(F)] do
>    p:=Set(List(e,x->x^i));
>    for a in e do
>      r:=RootFFE(F,a,i);
>      if a in p and r=fail then Error("-1"); return -1;fi;
>      if r<>fail and a<>r^i then Error("1");return 1;fi;
>    od;
>  od;
>  return 0;
> end;;
gap> qs:=[2,3,4,5,7,8,9,11,13,16,17,19,25,27,32,64,81,125,128,243,256];;
gap> ForAll(qs,x->Rochambeau(GF(x))=0);
true

#
gap> STOP_TEST("ffe.tst");

[ Dauer der Verarbeitung: 0.46 Sekunden  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge