Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
/* Copyright (C) 2011 The PARI group.12This file is part of the PARI/GP package.34PARI/GP is free software; you can redistribute it and/or modify it under the5terms of the GNU General Public License as published by the Free Software6Foundation; either version 2 of the License, or (at your option) any later7version. It is distributed in the hope that it will be useful, but WITHOUT8ANY WARRANTY WHATSOEVER.910Check the License for details. You should have received a copy of it, along11with the package; see the file 'COPYING'. If not, write to the Free Software12Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */1314#include "pari.h"15#include "paripriv.h"1617static int18cmp_G(void *E, GEN x, GEN y) { (void)E; return cmp_universal(x,y); }1920/* a ZG is either a t_INT or a t_VEC of pairs [g,e] representing21* \sum e_i [g_i], e_i in Z, g_i in G. */22GEN23ZG_normalize(GEN x)24{25if (typ(x) == t_INT) return x;26return sort_factor(shallowcopy(x), NULL, &cmp_G);27}28GEN29ZG_add(GEN x, GEN y)30{31if (typ(x) == t_INT)32{33if (!signe(x)) return y;34if (typ(y) == t_INT)35{36if (!signe(y)) return x;37return addii(x,y);38}39x = to_famat_shallow(gen_1,x);40}41else if (typ(y) == t_INT)42{43if (!signe(y)) return x;44y = to_famat_shallow(gen_1,y);45}46x = merge_factor(x, y, NULL, &cmp_G);47if (lg(gel(x,1)) == 1) return gen_0;48return x;49}50GEN51ZG_neg(GEN x)52{53if (typ(x) == t_INT) return negi(x);54return mkmat2(gel(x,1),ZC_neg(gel(x,2)));55}56GEN57ZG_sub(GEN x, GEN y) { return ZG_add(x, ZG_neg(y)); }5859/* x * c.[1], x in Z[G] */60GEN61ZG_Z_mul(GEN x, GEN c)62{63if (is_pm1(c)) return signe(c) > 0? x: ZG_neg(x);64if (typ(x) == t_INT) return mulii(x,c);65return mkmat2(gel(x,1), ZC_Z_mul(gel(x,2), c));66}6768GEN69ZG_mul(GEN x, GEN y)70{71pari_sp av;72GEN z, XG, XE;73long i, l;74if (typ(x) == t_INT) return ZG_Z_mul(y, x);75if (typ(y) == t_INT) return ZG_Z_mul(x, y);76av = avma;77XG = gel(x,1); XE = gel(x,2); l = lg(XG);78z = ZG_Z_mul(G_ZG_mul(gel(XG,1), y), gel(XE,1));79for (i = 2; i < l; i++)80{81z = ZG_add(z, ZG_Z_mul(G_ZG_mul(gel(XG,i), y), gel(XE,i)));82if (gc_needed(av,3))83{84if(DEBUGMEM>1) pari_warn(warnmem,"ZG_mul, i = %ld/%ld",i,l-1);85z = gerepilecopy(av, z);86}87}88return z;89}90GEN91ZGCs_add(GEN x, GEN y)92{93GEN xi = gel(x,1), xv = gel(x,2);94GEN yi = gel(y,1), yv = gel(y,2);95long i = 1, j = 1, k = 1, lx = lg(xi), ly = lg(yi), l = lx+ly-1;96GEN zi = cgetg(l, t_VECSMALL), zv = cgetg(l, t_VEC);97while (i < lx && j < ly)98{99if (xi[i] < yi[j]) { zi[k] = xi[i]; gel(zv,k) = gel(xv,i); i++; }100else if (xi[i] > yi[j]) { zi[k] = yi[j]; gel(zv,k) = gel(yv,j); j++; }101else { zi[k] = xi[i]; gel(zv,k) = ZG_add(gel(xv,i),gel(yv,j)); i++; j++; }102k++;103}104for(; i < lx; i++,k++) { zi[k] = xi[i]; gel(zv,k) = gel(xv,i); }105for(; j < ly; j++,k++) { zi[k] = yi[j]; gel(zv,k) = gel(yv,j); }106setlg(zi,k);107setlg(zv,k); return mkvec2(zi, zv);108}109GEN110ZG_G_mul(GEN x, GEN y)111{112long i, l;113GEN z, X;114if (typ(x) == t_INT) return signe(x)? to_famat_shallow(y, x): gen_0;115X = gel(x,1);116z = cgetg_copy(X, &l);117for (i = 1; i < l; i++) gel(z,i) = gmul(gel(X,i), y);118return ZG_normalize( mkmat2(z, gel(x,2)) );119}120GEN121G_ZG_mul(GEN x, GEN y)122{123long i, l;124GEN z, Y;125if (typ(y) == t_INT) return to_famat_shallow(x, y);126Y = gel(y,1);127z = cgetg_copy(Y, &l);128for (i = 1; i < l; i++) gel(z,i) = gmul(x, gel(Y,i));129return ZG_normalize( mkmat2(z, gel(y,2)) );130}131void132ZGC_G_mul_inplace(GEN v, GEN x)133{134long i, l = lg(v);135for (i = 1; i < l; i++) gel(v,i) = ZG_G_mul(gel(v,i), x);136}137GEN138ZGC_G_mul(GEN v, GEN x)139{ pari_APPLY_same(ZG_G_mul(gel(v,i), x)); }140GEN141G_ZGC_mul(GEN x, GEN v)142{ pari_APPLY_same(G_ZG_mul(gel(v,i), x)); }143GEN144ZGC_Z_mul(GEN v, GEN x)145{ pari_APPLY_same(ZG_Z_mul(gel(v,i), x)); }146147148