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");