TP12-sol.cas
4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
restart;maple_mode(1);cas_setup(0,0,0,1,0,1e-10,10,[1,50,0,25],0,0,0); #radians,pas de cmplx, pas de Sqrt
GF(3,6,'a');
(1+a)^17;
Factor(x^3-x+1) mod 3;
factor(x^3-x+1,a);
factor(x^3-x+a,a);
Factor(x^{3^5}-x) mod 3;
GF(3,20,'b'); #c'est trop gros:No irreducible primitive polynomial found Error:
Factor(X^8+1) mod 3;
l:={1,2,3,4,3,4};
l minus {1,3};
l minus l;
orbites:=proc(n)
local a,i,j,k,l,o,liste;
liste:=[];
if n mod 3 =0 then print("Erreur: 3 divise",n)
else
l:={seq(i,i=0..n-1)};
j:=1;
while l<>{} do
i:=l[1];
o:={i};a:=(3*i) mod n;
while a<>i do o:=o union {a};a:= (3*a) mod n; od;
l:= (l minus o); liste:=[op(liste),o];
od;
fi;
liste;
end proc;
Factor(X^32-1) mod 3;
orbites(32);
Factor(X^14-1) mod 3;
orbites(14);
/* On remarque que pour tout i il y a autant d'orbites \`a i elements que de facteurs irreductibles de degre i*/
for i from 1 to 8 do print(nops(orbites(2^i)[2]),2^i) od;
/* (Cf cours)On peut montrer que le noyau de la surjection donn\'ee par la£ reduction mod 4 est cyclique d'ordre 2^(n-2)£ -3=1+4.m ou m est impair, donc -3 est d'ordre maximal donc 3 aussi.£ En fait les elements d'ordre max sont ceux congrus a 5 ou -5 mod 8*/
for i from 1 to 8 do print(factor(X^(2^i)-1),2^i) od;
/* le poly cyclo Phi_2^n est phi(n)*/
phi:=n->X^(2^(n-1))+1;
for i from 1 to 8 do print(Factor(phi(i)) mod 3) od;
for i from 1 to 100 do if ((3^i-1) mod 2^8) == 0 then print(i) fi; od;
/* on prend i=64*/
Factor(X^128+1) mod 3;
P:=X^64+X^32-1;
Factor(P) mod 3; #P convient
/* ----------------Racines carrees---------------------------------------------------------------------------*/
P:=x^64+x^32-1;
puiss:=proc(g,n)
local u,v;
u:=1;v:=g;
while n>1 do
if (n mod 2 )==0 then v:=Rem(v*v,P) mod 3; n:=n/2;
else u:=Rem(u*v,P) mod 3; v:=Rem(v*v,P) mod 3; n:=(n-1)/2;
fi;od;
Rem(u*v,P)mod 3;end;
puiss(1+x,5^7);
puiss:=(g,n)->powmod(g,n,3,P,x);
puiss(1+x,5^7); # on v\'erifie
q:=3^64;t:=(q-1)/2^8;
testcarre:=proc(g)
evalb(puiss(g,(q-1)/2)=1);
end proc;
testcarre(1+x); # 1+x ne convient pas
testcarre(1+x^5); # 1+x^5 n'est pas un carre donc g est d'ordre 2^8.
g:=puiss(1+x^5,t); # verification:
b:=[];
for i from 0 to 8 do b:=[op(b),puiss(g,2^i)] od;
inve:=proc(v)
puiss(v,q-2)
end proc;
z:=1+x;testcarre(z);
(u,v):=igcdex(t,2^8)[1..2];
/* dans cet exemple u est negatif, on cherche donc l'inverse de z*/
z1:=puiss(inve(z),-u*t);
z2:=puiss(z,v*2^8);
/* verification de l'isomorphisme produit on doit retrouver z:*/
Rem(z1*z2,P) mod 3;z;
/* On n'etait pas oblig\'e de trouver l'inverse de z, on utilise que z^(q-2)*z=1*/
z1:=puiss(z,(u*t) mod (q-1));
Rem(z1*z2,P) mod 3;z; #attention, pour Rem mod il faut des x
/* on verifie d'abord si q+1 est divisible par 4, si oui c'est tres simple.*/
(q+1) mod 4; #tant pis..
racinez2:=puiss(z2,(t+1)/2); #racine de z2:
puiss(racinez2,2);z2; #verification:
m:=[seq(0,8)];xx:=z1; #on sauve z1
for i from 7 to 0 by -1 do if Rem(puiss(z1,2^i)+1,P) mod 3 = 0 then
m[8-i]:=1;z1:=Rem(z1*inve(b[8-i]),P) mod 3; else m[8-i]:=0;fi od;
/* verification:*/
z1:=1; for i from 1 to 8 do z1:=Rem(z1*puiss(b[i],m[i]),P) mod 3 od: z1;xx;#on verife que l'on trouve bien la valeur sauvee.
racinez1:=1;for i from 2 to 8 do racinez1:=Rem(racinez1*puiss(b[i-1],m[i]),P) mod 3 od:puiss(racinez1,2);z1;
racinez:=normal(Rem(racinez1*racinez2,P) mod 3);
puiss(racinez,2);z;
/* ------------------------Exercice: Ordre d'un element-----------------------------------*/
/* Pour avoir la matrice (nombre premier, multiplicite), on utilise en mode xcas£ maple_ifactors. En mode maple ifactors coincide avec maple_ifactors. */
maple_ifactors(36*7)[2];
ifactors(36*7)[2];
transpose(ifactors(36*7)[2])[1];
ordre:=proc(x,n)
local m,l,p,y;
m:=Phi(n);
l:=(maple_ifactors(m)[2]);
for i from 1 to rowdim(l) do
m:=iquo(m,l[i,1]^l[i,2]);y:=powmod(x,m,n);
while y <> 1 do y:=powmod(y,l[i,1],n);m:=m*l[i,1]; od;
od;
m;
end;
ordre(-1,2^1000);
pari():;
if (pari_znorder(Mod(5,11^5*2^40*101)) == ordre(5,11^5*2^40*101)) then
print("ca marche") else print("il y a une erreur") fi;