Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Testing latest pari + WASM + node.js... and it works?! Wow.

28495 views
License: GPL3
ubuntu2004
1
rgcd(a,b)=
2
{
3
[a,b] = [abs(a), abs(b)];
4
while (b > 0.01, [a,b] = [b,a%b]);
5
a;
6
}
7
8
global(nf, km, m, clh, R, areg, re, res, mreg);
9
10
f(a,b, nf,v,ind)=
11
{ my(u, vreg);
12
my(n = idealnorm(nf, a + b*variable(nf.pol)));
13
my(mv = vectorv(#v));
14
forprime (p=2, #ind,
15
my (l = valuation(n,p));
16
if (l,
17
my(cp, j = ind[p]);
18
n /= p^l; cp = v[j][2];
19
while((a+b*cp)%p,
20
j++; cp = v[j][2]
21
);
22
mv[j] = l
23
)
24
);
25
if (n!=1, return);
26
my (r1 = nf.sign[1]);
27
28
/* found a relation */
29
vreg = vectorv(#re,j,
30
u = a+b*re[j];
31
if (j<=r1, abs(u), norm(u))
32
);
33
mreg = concat(mreg, log(vreg));
34
m = concat(m, mv);
35
areg = concat(areg, a+b*t);
36
print1("(" res++ ": " a "," b ")");
37
}
38
39
clareg(pol, plim=19, lima=50, extra=5)=
40
{ my(coreg,lireg,r1,ind,fa,co,a,b,mh,ms,mhs,mregh);
41
42
nf=nfinit(pol); pol=nf.pol;
43
re = nf.roots; r1=nf.sign[1];
44
if (nf.index > 1, /* power basis <==> index = 1 */
45
error("sorry, the case 'index>1' is not implemented")
46
);
47
printf("discriminant = %s, signature = %s\n", nf.disc, nf.sign);
48
49
lireg = sum(i=1,2, nf.sign[i]); /* r1 + r2 */
50
ind=vector(plim); v=[];
51
forprime(p=2,plim,
52
my (w = factormod(pol,p));
53
my (e = w[,2]);
54
my (find = 0);
55
for(l=1,#e,
56
fa = lift(w[l,1]);
57
if (poldegree(fa) == 1,
58
if (!find, find=1; ind[p]=#v+1);
59
v = concat(v, [[p,-polcoeff(fa,0),e[l]]])
60
)
61
)
62
);
63
co = #v+extra;
64
res=0; print("need ", co, " relations");
65
areg=[]~; mreg = m = [;];
66
a=1; b=1; f(0,1, nf,v,ind);
67
while (res<co,
68
if (gcd(a,b)==1,
69
f(a,b, nf,v,ind); f(-a,b, nf,v,ind)
70
);
71
a++;
72
if (a*b>lima, b++; a=1)
73
);
74
print(" ");
75
mh=mathnf(m); ms=matsize(mh);
76
if (ms[1]!=ms[2],
77
print("not enough relations for class group: matrix size = ",ms);
78
return
79
);
80
81
mhs = matsnf(mh,4);
82
clh = prod(i=1,#mhs, mhs[i]);
83
printf("class number = %s, class group = %s\n", clh, mhs);
84
areg=Mat(areg); km=matkerint(m); mregh=mreg*km;
85
if (lireg==1,
86
R = 1
87
,
88
coreg = #mregh;
89
if (coreg < lireg-1,
90
print("not enough relations for regulator: matsize = ", matsize(mregh));
91
R = "(not given)";
92
,
93
mreg1 = mregh[1 .. lireg-1, ];
94
R = 0;
95
for(j=lireg-1,coreg,
96
a = matdet(mreg1[, j-lireg+2 .. j]);
97
R = rgcd(a,R)
98
)
99
)
100
);
101
print("regulator = " R);
102
}
103
104
check(lim=200) =
105
{ my(r1,r2,pol,z,Res,fa);
106
107
[r1,r2] = nf.sign;
108
pol = nf.pol;
109
z = 2^r1 * (2*Pi)^r2 / sqrt(abs(nf.disc)) / nfrootsof1(nf)[1];
110
Res = 1.; \\ Res (Zeta_K,s=1) ~ z * h * R
111
forprime (q=2,lim,
112
fa = factormod(pol,q,1)[,1];
113
Res *= (q-1)/q / prod(i=1, #fa, 1 - q^(-fa[i]))
114
);
115
z * clh * R / Res;
116
}
117
118
fu() = vector(#km, k, factorback(concat(areg, km[,k])));
119
120