Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

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

28479 views
License: GPL3
ubuntu2004
1
/* Copyright (C) 2011 The PARI group.
2
3
This file is part of the PARI/GP package.
4
5
PARI/GP is free software; you can redistribute it and/or modify it under the
6
terms of the GNU General Public License as published by the Free Software
7
Foundation; either version 2 of the License, or (at your option) any later
8
version. It is distributed in the hope that it will be useful, but WITHOUT
9
ANY WARRANTY WHATSOEVER.
10
11
Check the License for details. You should have received a copy of it, along
12
with the package; see the file 'COPYING'. If not, write to the Free Software
13
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
14
15
#include "pari.h"
16
#include "paripriv.h"
17
18
static int
19
cmp_G(void *E, GEN x, GEN y) { (void)E; return cmp_universal(x,y); }
20
21
/* a ZG is either a t_INT or a t_VEC of pairs [g,e] representing
22
* \sum e_i [g_i], e_i in Z, g_i in G. */
23
GEN
24
ZG_normalize(GEN x)
25
{
26
if (typ(x) == t_INT) return x;
27
return sort_factor(shallowcopy(x), NULL, &cmp_G);
28
}
29
GEN
30
ZG_add(GEN x, GEN y)
31
{
32
if (typ(x) == t_INT)
33
{
34
if (!signe(x)) return y;
35
if (typ(y) == t_INT)
36
{
37
if (!signe(y)) return x;
38
return addii(x,y);
39
}
40
x = to_famat_shallow(gen_1,x);
41
}
42
else if (typ(y) == t_INT)
43
{
44
if (!signe(y)) return x;
45
y = to_famat_shallow(gen_1,y);
46
}
47
x = merge_factor(x, y, NULL, &cmp_G);
48
if (lg(gel(x,1)) == 1) return gen_0;
49
return x;
50
}
51
GEN
52
ZG_neg(GEN x)
53
{
54
if (typ(x) == t_INT) return negi(x);
55
return mkmat2(gel(x,1),ZC_neg(gel(x,2)));
56
}
57
GEN
58
ZG_sub(GEN x, GEN y) { return ZG_add(x, ZG_neg(y)); }
59
60
/* x * c.[1], x in Z[G] */
61
GEN
62
ZG_Z_mul(GEN x, GEN c)
63
{
64
if (is_pm1(c)) return signe(c) > 0? x: ZG_neg(x);
65
if (typ(x) == t_INT) return mulii(x,c);
66
return mkmat2(gel(x,1), ZC_Z_mul(gel(x,2), c));
67
}
68
69
GEN
70
ZG_mul(GEN x, GEN y)
71
{
72
pari_sp av;
73
GEN z, XG, XE;
74
long i, l;
75
if (typ(x) == t_INT) return ZG_Z_mul(y, x);
76
if (typ(y) == t_INT) return ZG_Z_mul(x, y);
77
av = avma;
78
XG = gel(x,1); XE = gel(x,2); l = lg(XG);
79
z = ZG_Z_mul(G_ZG_mul(gel(XG,1), y), gel(XE,1));
80
for (i = 2; i < l; i++)
81
{
82
z = ZG_add(z, ZG_Z_mul(G_ZG_mul(gel(XG,i), y), gel(XE,i)));
83
if (gc_needed(av,3))
84
{
85
if(DEBUGMEM>1) pari_warn(warnmem,"ZG_mul, i = %ld/%ld",i,l-1);
86
z = gerepilecopy(av, z);
87
}
88
}
89
return z;
90
}
91
GEN
92
ZGCs_add(GEN x, GEN y)
93
{
94
GEN xi = gel(x,1), xv = gel(x,2);
95
GEN yi = gel(y,1), yv = gel(y,2);
96
long i = 1, j = 1, k = 1, lx = lg(xi), ly = lg(yi), l = lx+ly-1;
97
GEN zi = cgetg(l, t_VECSMALL), zv = cgetg(l, t_VEC);
98
while (i < lx && j < ly)
99
{
100
if (xi[i] < yi[j]) { zi[k] = xi[i]; gel(zv,k) = gel(xv,i); i++; }
101
else if (xi[i] > yi[j]) { zi[k] = yi[j]; gel(zv,k) = gel(yv,j); j++; }
102
else { zi[k] = xi[i]; gel(zv,k) = ZG_add(gel(xv,i),gel(yv,j)); i++; j++; }
103
k++;
104
}
105
for(; i < lx; i++,k++) { zi[k] = xi[i]; gel(zv,k) = gel(xv,i); }
106
for(; j < ly; j++,k++) { zi[k] = yi[j]; gel(zv,k) = gel(yv,j); }
107
setlg(zi,k);
108
setlg(zv,k); return mkvec2(zi, zv);
109
}
110
GEN
111
ZG_G_mul(GEN x, GEN y)
112
{
113
long i, l;
114
GEN z, X;
115
if (typ(x) == t_INT) return signe(x)? to_famat_shallow(y, x): gen_0;
116
X = gel(x,1);
117
z = cgetg_copy(X, &l);
118
for (i = 1; i < l; i++) gel(z,i) = gmul(gel(X,i), y);
119
return ZG_normalize( mkmat2(z, gel(x,2)) );
120
}
121
GEN
122
G_ZG_mul(GEN x, GEN y)
123
{
124
long i, l;
125
GEN z, Y;
126
if (typ(y) == t_INT) return to_famat_shallow(x, y);
127
Y = gel(y,1);
128
z = cgetg_copy(Y, &l);
129
for (i = 1; i < l; i++) gel(z,i) = gmul(x, gel(Y,i));
130
return ZG_normalize( mkmat2(z, gel(y,2)) );
131
}
132
void
133
ZGC_G_mul_inplace(GEN v, GEN x)
134
{
135
long i, l = lg(v);
136
for (i = 1; i < l; i++) gel(v,i) = ZG_G_mul(gel(v,i), x);
137
}
138
GEN
139
ZGC_G_mul(GEN v, GEN x)
140
{ pari_APPLY_same(ZG_G_mul(gel(v,i), x)); }
141
GEN
142
G_ZGC_mul(GEN x, GEN v)
143
{ pari_APPLY_same(G_ZG_mul(gel(v,i), x)); }
144
GEN
145
ZGC_Z_mul(GEN v, GEN x)
146
{ pari_APPLY_same(ZG_Z_mul(gel(v,i), x)); }
147
148