Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
/* Copyright (C) 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"1617static long18groupelts_sumorders(GEN S)19{20long i, s = 0;21for(i=1; i < lg(S); i++) s += perm_orderu(gel(S,i));22return s;23}2425static long26vecgroup_sumorders(GEN L)27{28long i, s = 0;29for(i=1; i<lg(L); i++) s += group_order(gel(L,i));30return s;31}3233static int34indexgroupsubgroup(GEN L, long order, const long *good, const long *bad)35{36long i;37for(i=1; i<lg(L); i++)38{39GEN G=gel(L,i);40long idx;41const long *p;42if (group_order(G)!=order) continue;43idx = group_ident(G,NULL);44for(p=good; *p; p++)45if (*p==idx) return 1;46for(p=bad; *p; p++)47if (*p==idx) return 0;48}49return 0;50}5152static int53indexgroupcentre(GEN G, GEN Z, const long *good, const long *bad)54{55long i;56for(i=1;i<lg(Z);i++)57{58GEN z=gel(Z,i);59if (perm_orderu(z)==2)60{61pari_sp btop=avma;62GEN H = cyclicgroup(z,2);63GEN C = group_quotient(G,H);64GEN Q = quotient_group(C,G);65const long *p;66long idx=group_ident(Q,NULL);67set_avma(btop);68for(p=good;*p;p++)69if (*p==idx) return 1;70for(p=bad;*p;p++)71if (*p==idx) return 0;72}73}74return 0;75}7677static GEN78vecgroup_idxlist(GEN L, long order)79{80pari_sp ltop=avma;81GEN V;82long i,j,n;83for (n=0,i=1; i<lg(L); i++)84if (group_order(gel(L,i))==order)85n++;86V=cgetg(n+1,t_VECSMALL);87for(i=1,j=1; j<=n; i++)88if (group_order(gel(L,i))==order)89V[j++]=group_ident(gel(L,i),NULL);90return gerepileupto(ltop,vecsmall_uniq(V));91}9293/* Group identification code.94* The group data are taken from GAP 4 and the SMALL GROUPS LIBRARY by Hans95* Ulrich Besche, Bettina Eick and Eamonn O'Brien.96*/9798static long99group_ident_i(GEN G, GEN S)100{101long n = S? lg(S)-1: group_order(G);102long s;103GEN F,p,e;104if (n==1) return 1;105if (!S) S = group_elts(G,group_domain(G));106s = groupelts_sumorders(S);/*This is used as a hash value*/107F = factoru(n);108p = gel(F,1);109e = gel(F,2);110switch(lg(p)-1)111{112case 1:/*prime power*/113switch (e[1])114{115case 1: /* p */116return 1;117case 2: /* p^2 */118return (s == 1 - p[1] + n*p[1])? 2: 1; /* pxp || p^2 */119case 3: /* p^3 */120{121GEN H = group_abelianSNF(G, S);122if (H) /*G is abelian*/123{124long l = lg(H)-1;125return (l==3)?5: l; /*pxpxp || p^3 or p^2xp*/126} /*G is not abelian*/127if (p[1] == 2)128return (s == 19)? 3: 4; /*D8 || Q8*/129else130{131long q = p[1]*p[1];132q *= q;133return (s == q - p[1] + 1)?3 :4; /* pxp:p || p^2:p */134}135}136}137break;138case 2:139switch(e[1]+e[2])140{141case 2: /*pq*/142return (p[2]%p[1]!=1)?1:1+group_isabelian(G); /*pq || pq or p:q*/143case 3:144if (p[1]==2 && e[1]==2) /* 4p */145{146long q = p[2], q2 = q*q, pmq2 = (q%4 == 1 || q==3);147if (s==3+5*q+3*q2) return 1; /* 2p.2 */148if (s==11-11*q+11*q2) return 2; /* 4p */149if (s==3+q+3*q2) return 3+pmq2; /* D4p */150if (s==7-7*q+7*q2) return 4+pmq2; /* 2px2 */151return 3; /*A4 or p:4 */152}153else if (p[1]==2 && e[1]==1) /*2p^2*/154{155long q = p[2], q2 = q*q, q3 = q*q2, q4 = q*q3;156if (s==1-q+3*q2-q3+q4) return 1; /* p^2:2 */157if (s==3-3*q+3*q2-3*q3+3*q4) return 2; /* 2p^2 */158if (s==1+q-2*q2+3*q3) return 3; /* D2pxp */159if (s==1-q+2*q2+q3) return 4; /* p:2+p:2 */160return 5; /* 2pxp */161}162else if (p[1]==3 && e[1]==2) /*9p, p>3*/163{164long q= p[2], q2 = q*q, p3 = (q%3 == 1), p9 = (q%9 == 1);165if (s==7+47*q+7*q2) return 1; /* 3p.3 */166if (s==61-61*q+61*q2) return 1+p3; /* 9p */167if (s==1+59*q+q2) return 3; /* p:9 */168if (s==7+11*q+7*q2) return 3+p9; /* p:3x3 */169return 2+2*p3+p9; /* 3^2xp */170}171break;172}173case 3:174switch(e[1]+e[2]+e[3])175{176case 3: /*pqr*/177if (p[1]==2) /*2qr*/178{179long q = p[2],q2 = q*q, qc = 1-q+q2, qd = 1+q+q2;180long r = p[3],r2 = r*r, rc = 1-r+r2, rd = 1+r+r2;181long pmq = (r%q==1)? 2: 0;182if (pmq && s==3*r*(q2-q)+rd) return 1; /* r:2q */183if (pmq && s==3*(r2+(q2-q-1)*r+1)) return 2; /* r:qx2 */184if (s==qd*rc) return 1+pmq; /* D2qxr */185if (s==rd*qc) return 2+pmq; /* D2rxq */186if (s==3*qc*rc) return 4+pmq; /* 2qr */187return 3+pmq; /* q:2+r:2 */188}189break;190}191}192{193const long tab[]={19424, 173, 301, 99, 125, 113, 101, 97, 85, 161, 133, 189, 67, 87, 73, 105, -1,19536, 255, 671, 265, 219, 427, 243, 147, 275, 115, 127, 121, 159, 111, 175,196-1,19740, 391, 903, 263, 311, 291, 271, 227, 207, 483, 399, 567, 163, 187, 315,198-1,19956, 697, 1849, 585, 557, 529, 413, 385, 989, 817, 1161, 351, 357, 645, -1,20060, 945, 721, 561, 1617, 211, 497, 337, 373, 651, 581, 693, 501, 1029, -1,20175, 3647, 271, 847, -1,20284, 647, 935, 1935, 1295, 1071, 3311, 451, 699, 595, 1333, 469, 1099, 1419,203987, 2107, -1,20488, 1573, 4773, 1397, 1353, 1309, 953, 909, 2553, 2109, 2997, 865, 1665, -1,20590, 1659, 1891, 1371, 3843, 775, 1407, 735, 903, 615, 1575, -1,206104, 2143, 6751, 991, 1935, 1883, 1831, 1307, 1255, 3611, 2983, 4239, 731,2071203, 2355, -1,208105, 1785, 6321, -1,209126, 1533, 2037, 3397, 3477, 2749, 7869, 777, 937, 721, 1281, 1425, 2881,2101369, 1849, 1201, 3225, -1,211132, 4995, 2947, 2595, 8547, 1663, 3441, 2639, 3663, 2463, 5439, -1,212136, 3547, 11739, 1499, 3275, 3207, 3139, 2183, 2115, 6279, 5187, 7371,213987, 1159, 2047, 4095, -1,214140, 4429, 3885, 2989, 9933, 3053, 1613, 1697, 3297, 3569, 2849, 6321, -1,215-1};216long i;217const long *t;218for(t=tab;*t!=-1;t++)219{220if (t[0]==n)221{222for(i=1; t[i] != -1; i++)223if (t[i]==s) return i;224return -1;225}226while (*t>=0) t++;227}228}229{230const long tab[]={23116, 1710031, 550075, 70099, 70075, 870059, 110059, 30079, 30071, 30063,232470131, 70155, 70107, 110115, 310307, -1,23332, 6830063, 150323, 1830171, /*230171*/0, 230227, 30283, 30251, 30203,234/*70267*/0, 70219, 110227, /*230171*/0, /*70187*/0, /*70187*/0, 110155,2353430123, 430123, 30191, 30175, 30159, 1110387, 150563, 150387, 230323, 230411,236230299, 70619, 70467, 70355, /*70379*/0, /*70379*/0, /*70267*/0, 70291, 70555,23770331, 1750291, 230291, 430275, 70411, 70363, 70315, 110331, 30371, 30323,238950819, 150995, 150643, 230691, 30747, 30635, 632451, -1,23948, 430156, 11970124, 10219, 430324, 110324, 30396, 30444, 30348, 230300,240110300, 230396, /*70396*/0, /*70396*/0, 70540, 30412, 30364, 30380, 30332,24170492, 3850300, 490396, 490300, 6090236, 770236, 210316, 210284, 210252, 30299,24230371, 30363, 110299, 70311, 110271, 70588, 230732, 70876, 110636, 30868,24330628, 30596, 30644, 150684, 70828, 3290524, 490620, 490428, 770460, 30627,24470571, 10643, 151740, 2171228, -1,24554, 10256, 16410120, 70292, 610232, 10373, 10292, 10616, 70517, 5610228,246210309, 210228, 250448, 70616, 11696, 2370552, -1,247/*64*/24872, 110307, 26230195, 210272, 30523, 110631, 30739, 70575, 30683,24914030351, 1830403, 1830299, 770346, 110586, 10750330, 10620, 210420, 71223,2509150663, 30426, 30858, 30978, 30954, 31074, 30762, 210452, 210538, 770634,251210730, 490626, 210722, 31018, 111234, 31450, 71106, 31322, 5750594, 750682,252750506, 10346, 10826, 10490, 70620, 11124, 10716, 30786, 31746, 210636, 491202,25372402, 3751122, -1,25480, 430250, 35910186, 110282, 430530, 110530, 30650, 30730, 30570,255230482, 110482, 230642, /*70642*/0, /*70642*/0, 70882, 30666, 30586, 30618,25630538, 70786, 11550450, 1470594, 1470450, 18270354, 2310354, 630474, 630426,257630378, 110562, 30562, 110722, 30722, 70546, 30546, 30946, 70962, 231202,25871442, 111042, 31426, 31026, 30978, 31058, 151106, 71346, 9870786, 1470930,2591470642, 2310690, 10467, 71266, 152866, 6511842, -1,26081,49210121, 6730319, 250427, 250319, 16450238, 610238, 70454, 70346,26170400, 70319, 5650670, 250994, 250670, 610589, 2412452, -1,262/*96*/263100, 30393, 57310217, 10481, 30693, 36470341, 630408, 30968, 13310392,264210416, 10576, 11256, 10856, 11096, 630648, 31768, 8470616, -1,265108, 30552, 60170280, 610359, 30984, 38290440, 210660, 1830540, 30849,26630660, 31308, 211137, 20570532, 770721, 770532, 70769, 11636, 11813, 610647,26770647, 250674, 70674, 70890, 211092, 1830852, 31389, 31092, 32388, 211965,26813090836, 491133, 490836, 751080, 211416, 33576, 8691288, 70904, 11048, 71720,26913688, 12344, 251538, 751608, 212280, 36600, 5532024,-1,270112, 430344, 73530248, 430736, 110736, 30904, 31016, 30792, 230664,271110664, 230888, 0/*70888*/, 0/*70888*/, 71224, 30920, 30808, 30856, 30744,27271080, 23650600, 3010792, 3010600, 37410472, 4730472, 1290632, 1290568,2731290504, 71336, 231672, 72008, 111448, 31984, 31424, 31360, 31472, 151528,27471864, 20211048, 3011240, 3010856, 4730920, 30643, 153992, 13332456,-1,275120, 2310456, 770488, 110648, 63210360, 30763, 210552, 30712, 31256,27631240, 31336, 31400, 31496, 31480, 31096, 630498, 210808, 770968, 211128,277490904, 211064, 630744, 2310888, 631032, 1470840, 630984, 31128, 111368, 31608,27871224, 31464, 33810648, 4410744, 4410552, 11211, 31263, 11416, 210858, 11290,27911090, 211032, 31352, 32600, 630738, 491864, 1471704, 72664, 22051224, -1,280135, 114870240, 39270456, 1470618, 1470456, 16591104 , -1,281-1};282long i;283const long *t;284GEN Z = groupelts_center(S), L = group_subgroups(G);285long scenter = groupelts_sumorders(Z), svecgroup = vecgroup_sumorders(L);286long u = svecgroup+10000*scenter; /*This is used as a hash value*/287288for(t=tab; *t!=-1; t++)289{290if (t[0]==n)291{292for(i=1; t[i] != -1; i++)293if (t[i]==u) return i;294switch(n)295{296case 32:297switch(u)298{299case 230171:300{301const long good[]={2,0}, bad[]={4,5,0};302return indexgroupcentre(G,Z,good,bad)? 4: 12;303}304case 70267:305if (s==135) return 9;306return 32;307case 70187:308{309const long good[]={8,0}, bad[]={7,9,0};310return indexgroupcentre(G,Z,good,bad)? 13: 14;311}312case 70379:313{314const long good[]={4,0},bad[]={0};315return indexgroupsubgroup(L,8,good,bad)? 31: 30;316}317}318break;319case 48: case 80:320{321const long good[]={5,8,0},bad[]={6,7,0};322return indexgroupcentre(G,Z,good,bad)? 12: 13;323}324case 112:325{326const long good[]={7,4,0},bad[]={5,6,0};327return indexgroupcentre(G,Z,good,bad)? 11: 12;328}329}330return -1;331}332while (*t!=-1) t++;333}334{335const long tab[]={ 64, 1270001, /*4270003*/0, /*4270003*/0, 8190072,3366430073, 6670445, 5550446, 8190278, 7070279, 6350071, 5230072, 8110154,337/*5870155*/0, /*5870155*/0, /*4270042*/0, /*4270042*/0, 7710246, 7390277,3386750037, 8032377, 8670266, 6750397, 11390022, 7710267, 7070277, /*3630046*/0,339/*3630046*/0, 3630057, 4830196, 4830207, 4671808, 9070697, 6670700, 8750094,3406990091, 6350111, 5870115, 6671599, 5711601, 5551702, 5871512, 6351709,3415391711, /*3630046*/0, 3630047, 4111467, /*4430156*/0, /*4430156*/0, 3790166,342/*2510026*/0, /*2510026*/0, 4470028, 4150300, 3830030, 13470021, 20350065,34310910041, 16514365, /*12190433*/0, 34110271, /*16514475*/0, 15230465,344/*10910433*/0, 9630041, 13470233, /*16514475*/0, 20834696, /*10910433*/0,34513954343, /*12190433*/0, 19553542, 13474377, 25790466, 15870467, 18914476,34614110477, /*14590443*/0, 13310443, 11550043, /*14590443*/0, 10270043, 8990002,3478990546, 8990646, 8993647, 8356896, 13310905, 13310915, 12039018, 16990866,34812670888, 15071116, 11551217, 12038218, 16031739, 12512740, 12353138, 12993048,34915391849, 11872850, 12993551, 12353851, 8991446, 8991447, 8354830, 9951566,3509951666, 8674709, 9317039, 8031897, 8030187, 7713641, 7714641, 7074743,3519236585, 9236415, 9236586, 10990821, 9879066, 8751833, 9873399, 8751766,35210990754, 8593054, 8593087, 6830446, 6833546, 17472434, 13953445, 14432313,35316352544, 12833555, 13313423, 15635143, 13234877, 13874853, 12755287, 17870919,35414190949, 13075209, 11955310, 10835253, 9715354, 11312124, 10193135, 11074927,35512197529, 9957664, 11074970, 12196539, 9956674, 9958907, 10439497, 9479551,3569554015, 8433958, 9553915, 8434058, 8918081, 7798421, 10110856, 10110756,3579476648, 8991757, 8991857, 8356682, 10994275, 8750435, 8590474, 9230510,35810355254, 8115355, 13556790, 15790679, 11310691, 12275539, 14035061, 11795172,3598750465, 7474472, 8750475, 8114920, 6110196, 6111806, 5951808, 10191819,3609238364, 8271841, 8590736, 9390959, 8432079, 25470255, 41792701, 25470275,36120355344, 27233751, 18593673, 19717567, 23394762, 17312707, 19717633, 46115277,36231557088, 22917189, 24677288, 24039835, 24676366, 16032362, 17793529, 17153269,36338432486, 21153763, 23393635, 16037076, 27710971, 27074338, 20995174, 23396204,36420193482, 17157790, 19550231, 14751475, 17153832, 19070249, 16038080, 33391110,36525875097, 22197835, 22195018, 21070221, 24590112, 18999456, 15952565, 18356361,36617237769, 18359003, 15951169, 14832955, 16110295, 18350268, 21392354, 22030301,36718353365, 15955257, 13550032, 18430405, 18434015, 17150260, 17154128, 27234036,36823710639, 20194057, 21157900, 24198470, 20679613, 21158141, 22435065, 21318520,36920197076, 67390501, 83715011, 51070497, 54590283, 58915129, 50275230, 52035340,370263870051, -1,371-1};372long i;373const long *t;374GEN V=vecgroup_idxlist(L,32);375long idxlist=vecsmall_pack(V,10,9967);376long w=10000*svecgroup+idxlist; /*This is used as a hash value*/377for(t=tab; *t!=-1; t++)378{379if (t[0]==n)380{381for(i=1; t[i] != -1; i++)382if (t[i]==w) return i;383switch(n)384{385case 64:386switch(w)387{388case 4270003:389return (scenter==439)? 2: 3;390case 5870155:391{392const long good[]={8,9,0},bad[]={7,0};393return indexgroupcentre(G,Z,good,bad)? 13: 14;394}395case 4270042:396{397const long good[]={13,0},bad[]={14,0};398return indexgroupcentre(G,Z,good,bad)? 15: 16;399}400case 4430156:401{402const long good[]={18,20,0},bad[]={19,0};403return indexgroupcentre(G,Z,good,bad)? 47: 48;404}405case 2510026:406return scenter==1367? 50: 51;407case 12190433:408return scenter==47? 59: 70;409case 16514475:410{411const long good[]={22,24,28,0},bad[]={23,25,27,30,0};412return indexgroupcentre(G,Z,good,bad)? 61: 66;413}414case 10910433:415{416const long good[]={23,31,0},bad[]={25,26,29,30,33,0};417return indexgroupcentre(G,Z,good,bad)? 63: 68;418}419case 14590443:420{421const long good[]={28,33,0},bad[]={30,34,0};422return indexgroupcentre(G,Z,good,bad)? 77: 80;423}424case 3630046:425{426const long good[]={3,0},bad[]={12,16,0};427if (scenter==695) return 26;428return indexgroupcentre(G,Z,good,bad)? 27: 44;429}430}431break;432}433return -1;434}435while (*t!=-1) t++;436}437}438{439const long tab[]={ 96, 316010002, 252010002, 707020000, 676160124,440676170124, 87180027, 988190278, 892200028, 876030110, 876040110, 876120110,441215111237, 503062153, 972141052, 972131052, 455091156, 167101154, 620160033,442620170033, 908031033, 908121033, 908041033, 199101564, 7130153, 7140153,443812150123, 247051165, 487091566, 812151024, 391071276, 103081274, 247111377,444988180195, 892190205, 924190197, 828200207, 103050134, 679020464, 295091075,445199070145, 391060235, 103101076, 7080146, 135111157, 295020044, 684030223,446684040223, 908050274, 135060255, 7070285, 812080286, 71092475, 876102476,447908112287, 684120223, 748130243, 748140243, 620150254, 492160043, 492170043,448764180045, 700190477, 636200047, 963110003, 779050031, 935100032, 799110033,449819210003, 791260032, 246270050, 723330003, 987340003, 651360031, 623380033,450647263930, 839351534, 455321350, 178211335, 791244031, 322256848, 189340236,451130316409, 599331360, 743244548, 935295937, 551333907, 189222029, 274255883,452525275609, 82306043, 610289391, 82315641, 82307025, 647262487, 839353950,4530/*455322385*/, 0/*455322385*/, 178233588, 791245051, 322256982, 130307015,454658286619, 983297004, 983297037, 599333858, 631365165, 631376165, 535386399,45566408676, 354390966, 871428265, 775411064, 631376407, 535386309, 114430028,456823441008, 314398920, 74437993, 831420054, 42405827, 90439425, 799440830,457847426805, 767410275, 815440314, 863429143, 487360134, 487371044, 66211564,45866231664, 871295713, 66231764, 679242567, 125228724, 210253894, 18306803,459546288536, 162390938, 919437378, 871401018, 162255761, 967304398, 967313318,460413274329, 498283470, 498288163, 29345108, 967401139, 727449579, 679411219,461775352619, 583261276, 919295225, 66312839, 423381047, 2437470, 759424560,462711448550, 770222372, 109272382, 551210244, 258222592, 551230264, 295242430,463647254411, 199262266, 482272602, 871283751, 423293752, 519303751, 519312662,46471320222, 167332232, 226340245, 327352266, 167360274, 167372584, 103382587,465647392595, 455406162, 263412616, 327428742, 487438955, 295440098, 358290331,466622253358, 886280358, 322410312, 754400322, 394443122, 282440313, 354423123,467522430323, 726220349, 990273529, 470450359, 742460359, 522470032, 198470031,468282480353, 290490033, 274500353, 414470000, 614490000, 605473864, 664459790,469723464091, 893482714, 675465704, 845486215, 184493728, 653478045, 941489155,470605501588, 925482982, 264492577, 589502601, 312450472, 371466994, 285450492,471989464902, 578470486, 770489139, 994490497, 546500507, 604460529, 65270050,472684510049, 468510050, 134510562, 831510052, -1473-1};474long i;475const long *t;476GEN V=vecgroup_idxlist(L,48);477long idx48=vecsmall_pack(V,10,9967);478long idx32=vecgroup_idxlist(L,32)[1];479long w=1000000*(svecgroup%997)+10000*idx32+idx48;480/*This is used as a hash value*/481for(t=tab; *t!=-1; t++)482{483if (t[0]==n)484{485for(i=1; t[i] != -1; i++)486if (t[i]==w) return i;487switch(n)488{489case 96:490switch(w)491{492case 455322385:493{494const long good[]={37,40,0},bad[]={34,41,0};495return indexgroupcentre(G,Z,good,bad)? 96: 97;496}497}498break;499}500return -1;501}502while (*t!=-1) t++;503}504}505}506return 0;507}508509long510group_ident(GEN G, GEN S)511{512pari_sp av = avma;513long idx = group_ident_i(G, S);514if (idx < 0) pari_err_TYPE("group_ident [not a group]", G);515if (!idx) pari_err_IMPL("galoisidentify for groups of order > 127");516return gc_long(av, idx);517}518519long520group_ident_trans(GEN G, GEN S)521{522const long tab[]={5234, 1, 2, -1,5246, 2, 1, -1,5258, 1, 2, 4, 5, 3, -1,5269, 1, 2, -1,52710, 2, 1, -1,52812, 5, 1, 4, 3, 2, -1,52914, 2, 1, -1,53015, 1, -1,53116, 1, 4, 10, 8, 5, 6, 13, 12, 14, 2, 9, 7, 11, 3, -1,53218, 5, 1, 3, 4, 2, -1,53320, 2, 1, 5, 4, 3, -1,53421, 2, 1, -1,53522, 2, 1, -1,53624, 8, 1, 7, 5, 12, 13, 6, 14, 2, 15, 4, 10, 9, 11, 3, -1,53725, 1, 2, -1,53826, 2, 1, -1,53927, 1, 2, 3, 5, 4, -1,54028, 3, 1, 4, 2, -1,54130, 2, 4, 3, 1, -1,542-1};543long n = group_order(G), s;544const long *t;545if (n == 1) return 1;546/* N.B. known up to 32 (Cannon-Holt) */547if (n > 30) pari_err_IMPL("group_ident_trans [n > 30]");548if (uisprime(n)) return 1;549s = group_ident(G,S);550for(t=tab;*t>=0;t++)551{552if (t[0]==n) return t[s];553while (*t>=0) t++;554}555return 0; /*LCOV_EXCL_LINE*/556}557558559