Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
/* Copyright (C) 2000-2003 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */1314#include "pari.h"15#include "paripriv.h"1617/********************************************************************/18/** **/19/** MEMBER FUNCTIONS **/20/** **/21/********************************************************************/22INLINE int23is_ell5(GEN x) {24long lx;25if (typ(x) != t_VEC) return 0;26lx = lg(x);27return lx == 17 || (lx == 6 && !is_vec_t(typ(gel(x,2))));28}29INLINE int is_ell(GEN x) {30long lx = lg(x);31return (typ(x) == t_VEC && lx == 17);32}3334static void35member_err(const char *s, GEN y) { pari_err_TYPE(s,y); }3637GEN38member_e(GEN x)39{40GEN y = get_prid(x);41if (!y) member_err("e",x);42return gel(y,3);43}4445GEN46member_f(GEN x)47{48GEN y = get_prid(x);49if (!y)50{51if (typ(x) == t_FFELT) return utoipos(FF_f(x));52member_err("f",x);53}54return gel(y,4);55}5657GEN58member_p(GEN x)59{60long t; GEN y = get_nf(x,&t);61if (y)62{63if (t == typ_RNF) return rnf_get_ramified_primes(x);64return nf_get_ramified_primes(y);65}66switch(t)67{68case typ_GAL: return gal_get_p(x);69case typ_ELL: switch(ell_get_type(x))70{71case t_ELL_Fp:72case t_ELL_Fq: return ellff_get_p(x);73case t_ELL_Qp: return ellQp_get_p(x);74default: member_err("p",x);75}76case typ_MODPR: x = get_prid(x);77case typ_PRID: return pr_get_p(x);78}79switch(typ(x)) {80case t_PADIC: return gel(x,2);81case t_FFELT: return FF_p_i(x);82}83member_err("p",x);84return NULL;85}8687GEN88member_bid(GEN x)89{90long t; (void)get_nf(x,&t);91switch(t) {92case typ_BNR: return bnr_get_bid(x);93case typ_BIDZ:94case typ_BID: return x;95}96member_err("bid",x);97return NULL;98}99100GEN101member_bnf(GEN x)102{103long t; GEN y = get_bnf(x,&t);104if (!y) {105if (t == typ_ELL && ell_get_type(x) == t_ELL_NF)106{107y = ellnf_get_bnf(x);108if (y) return y;109}110member_err("bnf",x);111}112return y;113}114115GEN116member_nf(GEN x)117{118long t; GEN y = get_nf(x,&t);119if (!y) {120if (t == typ_RNF) return gel(x,10);121if (t == typ_ELL && ell_get_type(x) == t_ELL_NF) return ellnf_get_nf(x);122member_err("nf",x);123}124return y;125}126127/* integral basis */128GEN129member_zk(GEN x)130{131long t; GEN y = get_nf(x,&t);132if (!y)133{134switch(t)135{136case typ_Q:137y = cgetg(3,t_VEC);138gel(y,1) = gen_1;139gel(y,2) = pol_x(varn(gel(x,1))); return y;140case typ_RNF:141return gel(x,7);142}143member_err("zk",x);144}145return nf_get_zk(y);146}147148GEN149member_disc(GEN x) /* discriminant */150{151long t; GEN y = get_nf(x,&t);152if (!y)153{154switch(t)155{156case typ_Q : return quad_disc(x);157case typ_QFB: return qfb_disc(x);158case typ_ELL: return ell_get_disc(x);159case typ_RNF: return rnf_get_disc(x);160}161member_err("disc",x);162}163return nf_get_disc(y);164}165166GEN167member_pol(GEN x) /* polynomial */168{169long t; GEN y = get_nf(x,&t);170if (!y)171{172switch(t)173{174case typ_POL: return x;175case typ_Q : return gel(x,1);176case typ_GAL: return gal_get_pol(x);177case typ_RNF: return rnf_get_pol(x);178}179if (typ(x)==t_POLMOD) return gel(x,2);180if (typ(x)==t_FFELT) return FF_to_FpXQ(x);181member_err("pol",x);182}183return nf_get_pol(y);184}185186GEN187member_polabs(GEN x)188{189long t; (void)get_nf(x,&t);190if (t != typ_RNF) member_err("pol",x);191return rnf_get_polabs(x);192}193194GEN195member_mod(GEN x) /* modulus */196{197long t; (void)get_nf(x,&t);198switch(t) {199case typ_GAL: return gal_get_mod(x);200case typ_BNR: return bnr_get_mod(x);201case typ_BIDZ: return bid_get_ideal(x);202case typ_BID: return bid_get_mod(x);203}204switch(typ(x))205{206case t_INTMOD: case t_POLMOD: case t_QUAD: break;207case t_PADIC: return gel(x,3);208case t_FFELT: return FF_mod(x);209case t_VEC:210if (checkmf_i(x))211{212GEN T = mf_get_field(x), CHI = mf_get_CHI(x), P = mfcharpol(CHI);213return (degpol(T) == 1)? P: (degpol(P) > 1? gmodulo(T, P): T);214}215else if (checkMF_i(x))216return mfcharpol(MF_get_CHI(x));217default: member_err("mod",x);218}219return gel(x,1);220}221222GEN223member_sign(GEN x) /* signature */224{225long t; GEN y = get_nf(x,&t);226if (!y) member_err("sign",x);227return gel(y,2);228}229GEN230member_r1(GEN x) { return gel(member_sign(x), 1); }231GEN232member_r2(GEN x) { return gel(member_sign(x), 2); }233234GEN235member_index(GEN x)236{237long t; GEN y = get_nf(x,&t);238if (!y)239{240if (t == typ_RNF) return rnf_get_index(x);241member_err("index",x);242}243return nf_get_index(y);244}245246/* x assumed to be output by get_nf: ie a t_VEC with length 11 */247static GEN248nfmats(GEN x)249{250GEN y;251if (!x) return NULL;252y = gel(x,5);253if (typ(y) == t_VEC && lg(y) < 8) return NULL;254return y;255}256257GEN258member_t2(GEN x) /* T2 matrix */259{260long t; GEN y = nfmats(get_nf(x,&t));261if (!y) member_err("t2",x);262return gram_matrix(gel(y,2));263}264265GEN266member_diff(GEN x) /* different */267{268long t; GEN y = nfmats(get_nf(x,&t));269if (!y) member_err("diff",x);270return gel(y,5);271}272273GEN274member_codiff(GEN x) /* codifferent */275{276long t;277GEN T, d, Di, nf = get_nf(x,&t), y = nfmats(nf);278if (!y) member_err("codiff",x);279T = gel(y,4);280Di = ZM_inv(T, &d); if (!d) return matid(lg(Di)-1);281return RgM_Rg_div(ZM_hnfmodid(Di, d), d);282}283284GEN285member_roots(GEN x) /* roots */286{287long t; GEN y = get_nf(x,&t);288if (!y)289{290if (t == typ_GAL) return gal_get_roots(x);291if (t == typ_ELL)292switch(ell_get_type(x))293{294case t_ELL_Qp: return mkcol( ellQp_root(x, ellQp_get_prec(x)) );295case t_ELL_Q:296case t_ELL_Rg: return ellR_roots(x, ellR_get_prec(x));297}298member_err("roots",x);299}300return nf_get_roots(y);301}302303/* assume x output by get_bnf: ie a t_VEC with length 10 */304static GEN305check_RES(GEN x, const char *s)306{307GEN y = gel(x,8);308if (typ(y) != t_VEC || lg(y) < 4) member_err(s,x);309return y;310}311312/* y = get_bnf(x, &t) */313static GEN314_member_clgp(GEN x, GEN y, long t) /* class group (3-component row vector) */315{316if (!y)317{318switch(t)319{320case typ_QUA: return mkvec3(gel(x,1), gel(x,2), gel(x,3));321case typ_BIDZ:322case typ_BID: return gel(x,2);323}324if (typ(x)==t_VEC)325switch(lg(x))326{327case 3: /* no gen */328case 4: return x;329}330member_err("clgp",x);331}332if (t==typ_BNR) return gel(x,5);333y = check_RES(y, "clgp"); return gel(y,1);334}335static GEN336_check_clgp(GEN x, GEN y, long t)337{ GEN c = _member_clgp(x,y,t); checkabgrp(c); return c; }338GEN339member_clgp(GEN x)340{ long t; GEN y = get_bnf(x,&t); return _check_clgp(x,y,t); }341342GEN343member_reg(GEN x) /* regulator */344{345long t; GEN y = get_bnf(x,&t);346if (!y)347{348if (t == typ_QUA) return gel(x,4);349member_err("reg",x);350}351if (t == typ_BNR) pari_err_IMPL("ray regulator");352y = check_RES(y, "reg");353return gel(y,2);354}355356GEN357member_fu(GEN x) /* fundamental units */358{359long t; GEN fu, y = get_bnf(x,&t);360if (!y)361{362switch(t)363{364case typ_Q:365x = quad_disc(x);366return (signe(x)<0)? cgetg(1,t_VEC): quadunit(x);367}368member_err("fu",x);369}370if (t == typ_BNR) pari_err_IMPL("ray units");371fu = bnf_get_fu_nocheck(y);372if (typ(fu) == t_MAT)373{ /*missing units*/374GEN SUnits = bnf_get_sunits(y);375if (!SUnits) return gen_0;376fu = bnf_build_units(y);377fu = vecslice(fu, 2, lg(fu)-1); /* remove torsion unit */378}379return matbasistoalg(y, fu);380}381382/* torsion units. return [w,e] where w is the number of roots of 1, and e a383* polmod (or integer) generator */384GEN385member_tu(GEN x)386{387long t; GEN bnf = get_bnf(x,&t), res = cgetg(3,t_VEC);388if (!bnf)389{390GEN y;391if (t != typ_Q) member_err("tu",x);392y = quad_disc(x);393if (signe(y) > 0 || abscmpiu(y,4) > 0) return mkvec2(gen_m1, gen_2);394395gel(res,1) = utoipos((itos(y) == -4)? 4: 6);396gel(res,2) = gcopy(x);397}398else399{400GEN z = bnf_get_tuU(bnf);401if (t == typ_BNR) pari_err_IMPL("ray torsion units");402gel(res,1) = utoipos( bnf_get_tuN(bnf) );403gel(res,2) = typ(z)==t_INT? gen_m1: basistoalg(bnf,z);404}405return res;406}407408/* structure of (Z_K/m)^*, where x is an idealstarinit (with or without gen)409* or a bnrinit (with or without gen) */410GEN411member_zkst(GEN x)412{413long t; (void)get_nf(x,&t);414switch(t)415{416case typ_BIDZ:417case typ_BID: return bid_get_grp(x);418case typ_BNR: {419GEN bid = bnr_get_bid(x);420if (typ(bid) == t_VEC && lg(bid) > 2) return bid_get_grp(bid);421}422}423member_err("zkst",x);424return NULL; /* LCOV_EXCL_LINE */425}426427GEN428member_no(GEN x) /* number of elements of a group (of type clgp) */429{430pari_sp av = avma;431long t; GEN y = get_bnf(x,&t);432if (t == typ_ELL) switch(ell_get_type(x))433{434case t_ELL_Fp:435case t_ELL_Fq: return ellcard(x, NULL);436}437x = _check_clgp(x,y,t);438return gc_const(av, abgrp_get_no(x));439}440441GEN442member_cyc(GEN x) /* cyclic decomposition (SNF) of a group (of type clgp) */443{444pari_sp av = avma;445long t; GEN y = get_bnf(x,&t);446if (t == typ_ELL) switch(ell_get_type(x))447{448case t_ELL_Fp:449case t_ELL_Fq: return ellgroup(x, NULL);450}451x = _check_clgp(x,y,t);452return gc_const(av, abgrp_get_cyc(x));453}454455/* SNF generators of a group (of type clgp), or generators of a prime456* ideal */457GEN458member_gen(GEN x)459{460pari_sp av;461long t; GEN y = get_bnf(x,&t);462switch(t)463{464case typ_MODPR: x = get_prid(x);465case typ_PRID: return mkvec2(gel(x,1), gel(x,2));466case typ_GAL: return gal_get_gen(x);467case typ_ELL: return ellgenerators(x);468}469av = avma;470x = _check_clgp(x,y,t);471if (lg(x)!=4) member_err("gen",x);472return gc_const(av, abgrp_get_gen(x));473}474GEN475member_group(GEN x)476{477long t; (void)get_nf(x,&t);478if (t == typ_GAL) return gal_get_group(x);479if (t == typ_ELL) return ellgroup0(x, NULL, 1);480member_err("group",x);481return NULL; /* LCOV_EXCL_LINE */482}483GEN484member_orders(GEN x)485{486long t; (void)get_nf(x,&t);487if (t == typ_GAL) return gal_get_orders(x);488member_err("orders",x);489return NULL; /* LCOV_EXCL_LINE */490}491492GEN493member_a1(GEN x)494{495if (!is_ell5(x)) member_err("a1",x);496return ell_get_a1(x);497}498499GEN500member_a2(GEN x)501{502if (!is_ell5(x)) member_err("a2",x);503return ell_get_a2(x);504}505506GEN507member_a3(GEN x)508{509if (!is_ell5(x)) member_err("a3",x);510return ell_get_a3(x);511}512513GEN514member_a4(GEN x)515{516if (!is_ell5(x)) member_err("a4",x);517return ell_get_a4(x);518}519520GEN521member_a6(GEN x)522{523if (!is_ell5(x)) member_err("a6",x);524return ell_get_a6(x);525}526527GEN528member_b2(GEN x)529{530if (!is_ell(x)) member_err("b2",x);531return ell_get_b2(x);532}533534GEN535member_b4(GEN x)536{537if (!is_ell(x)) member_err("b4",x);538return ell_get_b4(x);539}540541GEN542member_b6(GEN x)543{544if (!is_ell(x)) member_err("b6",x);545return ell_get_b6(x);546}547548GEN549member_b8(GEN x)550{551if (!is_ell(x)) member_err("b8",x);552return ell_get_b8(x);553}554555GEN556member_c4(GEN x)557{558if (!is_ell(x)) member_err("c4",x);559return ell_get_c4(x);560}561562GEN563member_c6(GEN x)564{565if (!is_ell(x)) member_err("c6",x);566return ell_get_c6(x);567}568569GEN570member_j(GEN x)571{572if (!is_ell(x)) member_err("j",x);573return ell_get_j(x);574}575576static int577ell_is_complex(GEN x)578{ long t = ell_get_type(x); return t == t_ELL_Q || t == t_ELL_Rg; }579580static long581ellnf_get_prec(GEN x) { return nf_get_prec(ellnf_get_nf(x)); }582583GEN584member_omega(GEN x)585{586if (!is_ell(x)) member_err("omega",x);587if (ell_get_type(x)==t_ELL_NF)588return ellnf_vecomega(x, ellnf_get_prec(x));589if (!ell_is_complex(x)) pari_err_TYPE("omega [not defined over C]",x);590return ellR_omega(x, ellR_get_prec(x));591}592593GEN594member_eta(GEN x)595{596if (!is_ell(x)) member_err("eta",x);597if (ell_get_type(x)==t_ELL_NF)598return ellnf_veceta(x, ellnf_get_prec(x));599if (!ell_is_complex(x)) pari_err_TYPE("eta [not defined over C]",x);600return ellR_eta(x, ellR_get_prec(x));601}602603GEN604member_area(GEN x)605{606if (!is_ell(x)) member_err("area",x);607if (ell_get_type(x)==t_ELL_NF)608return ellnf_vecarea(x, ellnf_get_prec(x));609if (!ell_is_complex(x)) pari_err_TYPE("area [not defined over C]",x);610return ellR_area(x, ellR_get_prec(x));611}612613GEN614member_tate(GEN x)615{616long prec;617if (!is_ell(x)) member_err("tate",x);618if (ell_get_type(x) != t_ELL_Qp)619pari_err_TYPE("tate [not defined over Qp]",x);620prec = ellQp_get_prec(x);621return ellQp_Tate_uniformization(x, prec);622}623624625