From 487958738bd3f7b8e051895c8eb81585f86659d1 Mon Sep 17 00:00:00 2001 From: mhostetter Date: Sun, 30 Jan 2022 10:45:10 -0500 Subject: [PATCH] Add more `characteristic_poly()` unit tests for matrices --- scripts/generate_field_test_vectors.py | 29 +++++- tests/fields/conftest.py | 12 +++ .../characteristic_poly_matrix.pkl | Bin 0 -> 1533 bytes .../data/GF(2)/characteristic_poly_matrix.pkl | Bin 0 -> 1090 bytes .../characteristic_poly_matrix.pkl | Bin 0 -> 1150 bytes .../GF(2^100)/characteristic_poly_matrix.pkl | Bin 0 -> 1977 bytes .../GF(2^2)/characteristic_poly_matrix.pkl | Bin 0 -> 1090 bytes .../GF(2^3)/characteristic_poly_matrix.pkl | Bin 0 -> 1090 bytes .../GF(2^32)/characteristic_poly_matrix.pkl | Bin 0 -> 1170 bytes .../GF(2^8)/characteristic_poly_matrix.pkl | Bin 0 -> 1090 bytes .../characteristic_poly_matrix.pkl | Bin 0 -> 1090 bytes .../GF(31)/characteristic_poly_matrix.pkl | Bin 0 -> 1090 bytes .../GF(3191)/characteristic_poly_matrix.pkl | Bin 0 -> 1109 bytes .../characteristic_poly_matrix.pkl | Bin 0 -> 1508 bytes .../data/GF(5)/characteristic_poly_matrix.pkl | Bin 0 -> 1090 bytes .../data/GF(7)/characteristic_poly_matrix.pkl | Bin 0 -> 1090 bytes .../GF(7^3)/characteristic_poly_matrix.pkl | Bin 0 -> 1095 bytes .../characteristic_poly_matrix.pkl | Bin 0 -> 1095 bytes tests/fields/test_arithmetic_methods.py | 20 +++- .../polys/test_characteristic_poly_matrix.py | 90 ------------------ 20 files changed, 59 insertions(+), 92 deletions(-) create mode 100644 tests/fields/data/GF(109987^4)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(2)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(2147483647)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(2^100)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(2^2)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(2^3)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(2^32)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(2^8)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(2^8, 283, 19)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(31)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(3191)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(36893488147419103183)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(5)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(7)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(7^3)/characteristic_poly_matrix.pkl create mode 100644 tests/fields/data/GF(7^3, 643, 244)/characteristic_poly_matrix.pkl delete mode 100644 tests/polys/test_characteristic_poly_matrix.py diff --git a/scripts/generate_field_test_vectors.py b/scripts/generate_field_test_vectors.py index d0b765de7..b78a91420 100644 --- a/scripts/generate_field_test_vectors.py +++ b/scripts/generate_field_test_vectors.py @@ -14,7 +14,7 @@ import sage import numpy as np -from sage.all import GF, PolynomialRing, log +from sage.all import GF, PolynomialRing, log, matrix FIELD = None SPARSE_SIZE = 20 @@ -76,6 +76,18 @@ def arange(low, high, sparse=False): return X +def randint_matrix(low, high, shape): + if high <= np.iinfo(np.int64).max: + X = np.random.randint(low, high, shape, dtype=np.int64) + else: + X = np.empty(shape, dtype=object) + iterator = np.nditer(X, flags=["multi_index", "refs_ok"]) + for i in iterator: + X[iterator.multi_index] = random.randint(low, high - 1) + + return X + + def io_1d(low, high, sparse=False): X = arange(low, high, sparse=sparse) @@ -253,6 +265,21 @@ def make_luts(field, sub_folder, seed, sparse=False): d = {"X": X, "Z": Z} save_pickle(d, folder, "characteristic_poly_element.pkl") + set_seed(seed + 13) + shapes = [(2,2), (3,3), (4,4), (5,5), (6,6)] + X = [] + Z = [] + for i in range(len(shapes)): + x = randint_matrix(0, order, shapes[i]) + X.append(x) + x = matrix(FIELD, [[F(e) for e in row] for row in x]) + p = x.charpoly() + z = np.array([I(e) for e in p.list()[::-1]], dtype=dtype).tolist() + z = z if z != [] else [0] + Z.append(z) + d = {"X": X, "Z": Z} + save_pickle(d, folder, "characteristic_poly_matrix.pkl") + ############################################################################### # Polynomial arithmetic ############################################################################### diff --git a/tests/fields/conftest.py b/tests/fields/conftest.py index 47c0812a1..5ae167ba0 100644 --- a/tests/fields/conftest.py +++ b/tests/fields/conftest.py @@ -303,3 +303,15 @@ def field_characteristic_poly_element(field_folder): d["X"] = GF(d["X"]) d["Z"] = [galois.Poly(p, field=GF.prime_subfield) for p in d["Z"]] return d + + +@pytest.fixture(scope="session") +def field_characteristic_poly_matrix(field_folder): + GF, folder = field_folder + with open(os.path.join(folder, "characteristic_poly_matrix.pkl"), "rb") as f: + print(f"Loading {f}...") + d = pickle.load(f) + d["GF"] = GF + d["X"] = [GF(x) for x in d["X"]] + d["Z"] = [galois.Poly(p, field=GF) for p in d["Z"]] + return d diff --git a/tests/fields/data/GF(109987^4)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(109987^4)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..5c1afa03cc2b823bf722ecccc2b976d09b7764a6 GIT binary patch literal 1533 zcmZ`(X;4#F6wb>_LY{z13OZ4&P{x`nCX}%PHDPgqN@SC^ECFMLK(JvcNhA!R4I8rw|flN(5m5ED{`)Ne@{LrsrWrl&}!hp0jBWWlc2=eQcnA_D^h z{a?cK>PzUQBsUj;3q-g}Zf?0xweYe)giJa%+YU4P&=66;k2s^7EYD^jf<0lVE$eYQ zMwh~jj4oqNi_2!bk;a8MNV8s(-MMn4;=8=(VKDYZT$(nnxuKDQ2&3j?0M~l(33T`2 zS&tVS{AGlWi2LgKv-}QjHbZG_4PG4W?zs?zf4(vr8e&~I1!Fzh(b8O0QVq^>7rcm? zRm3Wyz1ss#NPFu+E?^H2Y1&B~5oen++c(AV|Aew=XS%zl<@|P#P{pTds_QfEVTf>H z`A0c6VJMwiJ(Dk3^Z@)Gig z2Sq^37UbAh_}Fzq`AlRf4*HE|0zd^u3#ut7)k61_=vJq9Vx%72^h!>2X{*Pkz(K9fyWWulWFBKRche(Wk3)ALuv-y%eJ~WdeQh?h&L$NBW6J$Kg{Wvm49>ju z*=Kz(d53~Cb0&*(9=X^;OkuI@kQhNOdg29Eh}om`r@X~>vx}C@yT{x z9mHk3*~Z?ubjTB+Wpdk#Da~RxMErF9<+jleXCy=Le!Je%HQ!Hpz*Nbyu0gHa)d83~ zYbEr(cy%fO%#Ij-uMCe2>HuGN#Mvc%cwH?dcYattIcKHzA^<$D9X7Qw{3>#HdOVlC6eZYzyOv=tLc`&`j z;tXqSSwvPhklo&*H_l%bk`LGoa^@LHQkEn5U8mDe%x!nF1#IqIamP}{5uA#cL~wla z!Tk$D5iwl#Ro=e(s+SOg7i?4LIJS`oy0czHD-t?bVtjhFrD`m4`p*tNLZHbay$`qK z9sL__Ta&cV>v97<1DF1L*6U2NE*N~Df`@v8^E}*LjsdKnmsT9mxiOCM2DS!uyOeWW zi{UHxc>lIUU8cM literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(2)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..7884c570292d1b020583b5e2416b12efc2071daa GIT binary patch literal 1090 zcmbVLyK2KQ6qWpHDV+-4GiLJI4xQ?yRN$dgDU^~p0tXr=xbonkkfjfUw%q7nLVkmvdB zk6HF3n1XqiP25n7@nJ&|jIE5zcg55$9nr>%ZcH_%G#G{Tl-X{`~>$9bEVIJ}r z`;ht$#k9`&e6fh#eBW3P5%Xz`ybsZjNPWm7QXS*}>f`53L}Jf*JsGJ>DPQd4>B!Va x^}ohg57C!TdFn@Pe*v>ae2)MC literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2147483647)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(2147483647)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..649372563bd7e617daab43d72a251d986496e4b8 GIT binary patch literal 1150 zcmZwGdq`7J90%|{P0G^J&`d&7OR*MOnVL&GBU=cR%;j;hsaGUYtj7bmh% ztxXje<;UfquXEM+SbMSWo<-tET3$^Oq|UM;d67HjE1La(HYq1{&bGj&+T>ZdaVhF5 zPWKeRpp?x4@XYWvX0NcK7WwV^hE!;8fjpxx=i@0Z-+M=divf3BXdQ0urYEh9bSFYrGnhZ0}DJa&oIMlsi?W2Cswhp;{a7!KhAq`1@Gq2N)b7SjF3>1q* zlfD9LHD#!EIWEZ>`(lJi-x4EW^^JDcg5>%@F0xzdZ6&maN3ii@eVSt${>0jsYzeP3o7s3v_jdM3m6N@RsOvjAu@ZjOrg_2q zE5>awy(fqDJLkr5IC8u_HUw_1dr=J&`n}mJvTKn^id-^UGYih^Q0SoF)P^{C$Ggh| z-rcu`-DmRWbM|UDZkDq;pOI2_Uu+>Sh;#5CcYZiAsceeLBPSe+Ox~3nY8US$KRg|A zWYi;c)%0NU_landF%iCubRWz1CDH2phUqhxe=nXxTA!>4A-4?yI&$u8iISwguS%Fc k{rJMg^~9z*wTxU%^ok+<#~m?blfGU<{QLd&Ja1L}1Av=8X#fBK literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2^100)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(2^100)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..1b7dc8a8043966df6ec4c63ef0febe568cf480dc GIT binary patch literal 1977 zcmZ`)do+}JA2-a5!8{4;7D6lcck)(9a?7sU2rCY;gbb5A%_Pkbt;o}4nR#%Mn%rV@ z%Uen05-W7UNmI1c*2*<^QkLfZs<+cW`#xvR%=w+)_wu=Xzt1G&bE?HfK0k?=E(hn0 z`N5BT6f-g=fpR1|jz)=OMlg;B#>E9DU>x${INFiusAG&c<`D+Q!#IS`ffz?TD)>tX z52K2l!EA9sSUTp8=~8i2QL1PfMkjIz!Hk3$+D4M7>mDrQ?3a5n4vvkvxVSh8;raYU zwPIjF8Gr&s*i)4uI&!6Dt|3t4m^)YXJi4`?AQYhk# z7)+fg-g@DR(eLWwG^jx*&`BF$=#pQdh*8A=itLx-BD*8{ZyQrmi|>`@5>VvsOoc;y zSc!f`w@IZKifmf5zCs!>)6SH1sU@OFv_ zoVKw57S}1 z7d_aiK&tB(QuhxRvL;PqBDDavq)hd7BbzMUw|C;GAa8D#_V<~Yg+1Iu+(&SGJVj>x z=jatQayB;)NCkkiYM&MSN-+b_7K( zCN=%*+Nw#`DdmgVkXpp{^|ok!){Bm4>f-)c4+53&O^@Cnyno^~bMvD%$L@T7?ct&#Kvw zYpc9BKCwdBt`$CP0H}lcA8`>ujI<0V>0_Wr$FS&=x_pHeez|QY1W#b3t8$*f_W2}| z1;DPgW_#J6iaA=^t6BrYXs7<_PN`&}v{v%M0+iy{<#OX?{hGxdyEZ`IrL$=(ks6-A z-+LZW2f@CDs&?J(C9E!+P9?BqE@a9!nkM%1`qt!bDU?jJQFClo)(9n<8M07hL7MF) z7#^Q&T=}j9+BQG$*OrQW`|utnQ3w2{!^txJj~QjADq+{bl@eBn(Bq`6YOTH7Z(y*; z`VwoVyU82V7H&v|(g_t&)|2Ywt19)t?;$62yVQftA-0yRcEEVYE9IOKuJ*1FwTcIf zp-~5KRr00sTtt}L|Ie5bsl;!#7%nT+mdM<6clRdhLu;<4rgG!+tCu=fRFZa$mdKyKc=kwt;G;&4x4eLReK zw8AGl%NEJOz6T~hzyb_kcw=jP#wB)sQhq;BzM(L_MdQbMRlb)@OQ$ zln(nEELcgyX8j~|IyJDQ?))2G71T1+=axBsx>eWcsiO~l68hWCJ~Stn=fBwBF9CjY ziMh$=Rx(A}sr^uyz_4rLUfLq9GM4x^lsb@j&&P1o>U|>^7QXIT^D&6zf;sX?qR}u?=t=rzQ9pTth2WdU^Rv7QXb*k@<@z(-)0*&wuuZ#8>9;{isiE!bV5;NMa z9B@v>%80uea;yB)yX;7ftr8(BL>Qgfhgu=~YbzG#e~P&esLVny33OxElz7|k&U_vn z8VBdI@xKBe>V`+7>E{n$Z?v3k@O20Gy|xY9PH{^%XOp^$2(5Q-Q22?-kQ8L*hJE7wq#A)pw)DSQXVMObbtE8^v?3I0t$IX z>T5wgKU_=jJg*_=hOi6#i7)6gk`JGf@!a=x0>&cNhplQG(45X=Y9r8YQt?&JuD7z^ qWfzCl!7Jp}UlB4EX@V2W+dN`ODEY7WlvpN#qT=5rwU0()QvM5oh)Tc! literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2^2)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(2^2)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..98a9825b5a44985f51828d5e53dd2c16576868db GIT binary patch literal 1090 zcmah|yGq1B6rIUS5i7xd%dOICVPzU|Acd6(BD>jvEV$VvCPfNi8y|t`_WDo$mChtN z7MBE*u;)I`x#!Np?1Qh1Ky=S5&5gXLM+@ggz1cN!wk>tMsh_L$qAV8;nbW6IXWQbX zD(kGG1DUWRk~u0?J>@`3yip>T^g(wtS5kS(d#5}y;i_tO+KIgNCAFV@-#7A#(lovO zu}}A-L`BOsnR)$I!XFSIhkz_C5A$Q^m!H7RSH5*SYm*!BpvOGafxM3#e&arY3VNSC z=TGIRb6@!II`##k&-vr~g(~d#`-UC}{S?9n_#Y2*!AFksazvl=kpsDI{G5@Bx^rI7 zptJiziq(;GYe;w>Jm`6jIuL!#!Cc<_W$VkQ4NLb)z-d!g;?v_k7T{snHIeFgvk literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2^3)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(2^3)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..b0342ea7625b7d6e174ce1821285315be75caf2e GIT binary patch literal 1090 zcmaizJ4?e*6vuBKHxY3X+&gyas)LhV!~-3iL=drUAO-s%CPN3Ii;qIK9>0^{N^c&& zCA1on{B!O(|Hr+MP55;ln)-Uxe(BxmgM+h0F<-3*lVz3+=EZY9d&;t>wU#H3Su$BJ zUh=G%Ps*Q=x=`Lhe%em4D}^e%NY z8r}T3tA2^eb-W$+q9&DT(;2_5y%yDtr8YgP{L*9G0tuYk>2`SC<=X>#%%P88@TX5G zVdJxb*VQLyD`W7X#s?mLAoFocK(D*L{~WB?Cf_%D_>dPpkUlj?&Mq>~IyL(vC;sT+ zPru895085PJ|l_heO~pPKGOdoQ8?N|5!f10;js?lM^vK2V~%xvL3Fz{di2p_9YmiR x9p>p*N0^k}ef5vK+x?ue*n}@%O#5xbh?TglLWv}BlU`f9BX|AkF-cMkegUf-eaZj; literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2^32)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(2^32)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..b5322c174d3cbeca882937e62758194d90931085 GIT binary patch literal 1170 zcmZwGX-pGA6bJBK*sY3U1jC_-3eivqtrF2FUXc>ST?GLvhjO+h#X!+gKw=OyN@*>@ z$ao8QaTrDMA~A?2=m!M^3>D)M;}r>FJR%~Bi2L8FpV(~nmpAiv-puT55p&SUP~ufU zq!v1sBnY_Zax%B(%T-x=jXX0a!;qe$*QewY%cLZ|MwO+@Ht2Iy22xHete8kF<8*3U zN;%=Fy+lE$5+jKsQl94Rc)Mbvl~`D{A%Cj|FWIFpCZ-ZwzrBTCM#96xxl!Q~A3S9s zsV2qjM>3CC%&X8e#~to>-$Ee0D)|j0LYkJMM!@p|wyuDD(*`x^TryU<7FYI>D zHdwLB#R~?eFtspP+u#jz-7kw9P?uM-67jY1@6w?1Yxf~Ib{&RiY;}rucrKWZytXxo z-=T8mKoC^8Wt76X31{ZQ!XW(xsGMx{felZGK122KR!^wv9$o_jb}5`-{0-wEtZ{wu z1GYpjn+V@bc$(c#o_R*YLD}geaOAX`D@+P}D}kTsjXYg#AqN+N& z#I1kz+wUk|i5Y0_hdY^=2as`)tKpNZ*Jq$^{`~9kMz2#ZEIRr618n_ts}p+Hie#3Om9Kq+qR!k>kg&_3E1Q39)G{1)dUi{6=x z*w3pc8-};}55e6H)obDEdCuYyl5O9_A#TrW+zi({DifikIyIN1dUE+fVkYAkd-{&C^vX)|lh*wI9B{Z%7@8nK1@bxfx+ zv!|xER#RryUmxF0**eUuyK8)@(B^xyyG6if(TV#4(WY}x{$_B?@9uHolHb3I;R38* z)ZFk2lflfMbvkeTKSWu@$HNrYSs~BkdU``c%GD7{~FQ-JLD%4-^#INhraK+cArfY7x{&Ht1ABnC=d&(eBDPD=Z{PQMov% zxsOWPK{}KtZ-Ixpbtr-kT{;Lx5LtmpbWEt(o$q^z9ftkPZ}-`G-uIn%rs9j|;*t6> zsU5y`U2g`QD3tPJ~(LjyF2&y2EAl4-dIcrdSyF+)~EVs`_@lQ2hgiY*8)O0%C|2H`59}@9&q>^gu z3`Z5|#glj+H7Lv3xr4QSxn|QXCb6K~@k*+9jk>S6gp=5fr*HvHpVQ>Vec}=i`%G1+ zdyF5@d~cD@;t<}&W0=P5fB8Fk9QUvf8;{QxI~?EJb?ScN7QV+SwqOsM`?r&i;8FaB zKX4ldaT;IX4sN1Zhg;-NXx3?$d9`>wJOIBHqJ8IDpSEk7h}pkj>PT z{0^J(58lSBxQZ+I8RyYF!Y^bqGD7{~FM-JNyK4i-d^hlB-LFAH6?Lzi4A>!F4Au$UmC>%cDMXw%GL51|lc z8*|Bh%en@Nc#=ZFOAr`z)4CLBVbrA%^r8nZHM{eDZ#yjenIH4)KJTA-XA>{_6GroT zs4{^$q((x{IsW8yHCvi;?d+s~&#R2N?pRd?r$=48H03<-T)*V0x(cjjp$giZiKwKm z#CWW7=D35pJ_$)geP*vw z*M}Lrh%5LGNAWi5`UP?dZ=wGG8S*C9vGw>Yv7+&PTBhzL4&htW>#$Asv5IM2#|!uu zKjKwkDK( z<$dxutf1Z+ojFLx2cGL!?-%(u>M5Ne>!rU>j$tp}z%KlbZ*Ud2@H+m%C2TCA9hk$7 tGai1z!?`Pt9o-crCG*@nGAGBfN;)skWk%9+m%JlIxg&dG$hK|!+5ag>vj6}9 literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(31)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(31)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..02f6779887fda815ff59fb0560f709f8e0d12e65 GIT binary patch literal 1090 zcmZuw%TB^j5WRi!5PV=jKtouvVyg>Rc4M4`g)3uX438!ykw2T6B~|Kwlk zrJa+QhC+IJ?wrn?nR~mozb|c-UT@q>j0b+wP@l)M<*GkkgnoY(zeLkv7!FsQRGveB zyqLd6VLXm_%ZZZ;IVsF1nPkhP-q|xo{K@y+BZEvbKR9p`XA-TJ{_Z7ndc~WsEN&&n zH4g@ZyI*~!H&PLgHeT1sT&ap+Q}9fXwJdOg;;vp$Mm38pU9Gn9ZjW<%LpTt5in4x` z)0c(suVa&))mdNU@^*y7FA#o85v?S0L-0#mJC-e7nBD#Vg{56Eb zmn*z3h&ot@4{-Puxx#yxt0@80KM;=oPle0rQ?*=Ns6yZS`*g`o`@HFDe@KO`!-x(g z7g~iiSbz>K0MRN&1%x$h6-J9zEfHYUsEebFdN>+bhcD!T4*4)b)W?yy zW#YQdixGW8pV0$SNK0Dty5dI8Xi%H>T0_=YPS+PqJsF83x>zh0w&JV(kcmK#)bsuO zGDg-=(%^Eh!FdA-9k*4SN>6KFrMI&!DU>6(`u^~3DD$+^_<@eF^NZKi*S`Yr0a$RCIICH+5$ zAH%!B+%fVy*?$V2?mk`VwtWuv$1+#2_5!O1q1-~kevbSSE1FpABkue(Z^)OB`V=Y4 z@cjat9PJu?hdQ4e^J`dpOT9$>DEjWh8=!j$9e=?bpVC+6>g31SKf~N2`38ITaAcpr z&-As9(2K5`6ZKTx!M{TB6U)t2whm^XLQXhr-;;7$( WOQ literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(36893488147419103183)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(36893488147419103183)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..00be818929bfb27a3f5046fb799186c82c511dc8 GIT binary patch literal 1508 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 KT^{>>BmWO*Agay) literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(7^3, 643, 244)/characteristic_poly_matrix.pkl b/tests/fields/data/GF(7^3, 643, 244)/characteristic_poly_matrix.pkl new file mode 100644 index 0000000000000000000000000000000000000000..a6851589350844ec2a189bd70285240438adbc3a GIT binary patch literal 1095 zcmZvbKWGzC9LMh^xil0lXtCg+?NA}Kns%$T0ns3o{wV6*@(e+qo z19eBwhB#GkEG#v1l||3ZEi@kZwUXzRnmRZ(=ed=|`m*meD!$&(fgJ^P&{dz0BO6+* zXS$%udQIQdSy7UZ#B*Iu2ll+*Tyook619uE^&)hq0<%&9v)PyG^yEB*SVaTZPFZ#@&Nk@Dcn4-@-X~j`{cT&UI3fitDUg zA(t_ED9kg4-+1I?#$4gUj=LsNGd{{jPOwu}R9 znekcrY;U0(sG0T|4}a0&9CPElr_P{~ax6}dlHZb-ue_U)Z*ob_8+R@%C#hsl-pQ)d JrChg>`v>dptTF%q literal 0 HcmV?d00001 diff --git a/tests/fields/test_arithmetic_methods.py b/tests/fields/test_arithmetic_methods.py index 6845a3ab7..23c9f29db 100644 --- a/tests/fields/test_arithmetic_methods.py +++ b/tests/fields/test_arithmetic_methods.py @@ -45,7 +45,25 @@ def test_characteristic_poly_element(field_characteristic_poly_element): zi = x[i].characteristic_poly() assert zi == Z[i] - # Only 0-D or 2-D arrays are allowed + # Only 0-D arrays are allowed with pytest.raises(ValueError): A = GF.Random(5) A.characteristic_poly() + + +def test_characteristic_poly_matrix(field_characteristic_poly_matrix): + GF, X, Z = field_characteristic_poly_matrix["GF"], field_characteristic_poly_matrix["X"], field_characteristic_poly_matrix["Z"] + + for i in range(len(X)): + dtype = random.choice(GF.dtypes) + xi = X[i].astype(dtype) + zi = xi.characteristic_poly() + assert zi == Z[i] + + # Only 2-D square arrays are allowed + with pytest.raises(ValueError): + A = GF.Random(5) + A.characteristic_poly() + with pytest.raises(ValueError): + A = GF.Random((2,3)) + A.characteristic_poly() diff --git a/tests/polys/test_characteristic_poly_matrix.py b/tests/polys/test_characteristic_poly_matrix.py deleted file mode 100644 index 47356428f..000000000 --- a/tests/polys/test_characteristic_poly_matrix.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -A pytest module to test the characteristic polynomial of a square matrix. - -Sage: - F = GF(3**5, repr="int") - A = [] - n = 2 - for i in range(n): - row = [] - for j in range(n): - row.append(F.fetch_int(randint(1, F.order()))) - A.append(row) - print(A) - A = matrix(A) - print(A.charpoly()) -""" -import pytest -import numpy as np - -import galois - - -def test_exceptions(): - GF = galois.GF(2**8) - with pytest.raises(ValueError): - A = GF.Random(5) - A.characteristic_poly() - with pytest.raises(ValueError): - A = GF.Random((4,5)) - A.characteristic_poly() - - -def test_2x2(): - GF = galois.GF(2**8) - A = GF([[242, 238], [10, 228]]) - poly = galois.Poly.String("x^2 + 22*x + 220", field=GF) - assert A.characteristic_poly() == poly - - GF = galois.GF(3**5) - A = GF([[188, 184], [78, 39]]) - poly = galois.Poly.String("x^2 + 136*x + 139", field=GF) - assert A.characteristic_poly() == poly - - -def test_3x3(): - GF = galois.GF(2**8) - A = GF([[227, 160, 206], [153, 242, 208], [41, 153, 83]]) - poly = galois.Poly.String("x^3 + 66*x^2 + 254*x + 16", field=GF) - assert A.characteristic_poly() == poly - - GF = galois.GF(3**5) - A = GF([[208, 235, 208], [60, 132, 142], [91, 79, 193]]) - poly = galois.Poly.String("x^3 + 100*x^2 + 100*x + 164", field=GF) - assert A.characteristic_poly() == poly - - -def test_4x4(): - GF = galois.GF(2**8) - A = GF([[98, 210, 148, 132], [243, 227, 215, 187], [88, 241, 186, 225], [191, 109, 185, 39]]) - poly = galois.Poly.String("x^4 + 28*x^3 + 159*x^2 + 184*x + 43", field=GF) - assert A.characteristic_poly() == poly - - GF = galois.GF(3**5) - A = GF([[19, 103, 61, 183], [235, 126, 119, 150], [226, 90, 169, 30], [185, 187, 54, 215]]) - poly = galois.Poly.String("x^4 + 116*x^3 + 208*x^2 + 19*x + 133", field=GF) - assert A.characteristic_poly() == poly - - -def test_5x5(): - GF = galois.GF(2**8) - A = GF([[161, 250, 106, 129, 28], [227, 186, 241, 38, 229], [87, 243, 246, 252, 238], [26, 221, 188, 183, 30], [190, 19, 97, 110, 202]]) - poly = galois.Poly.String("x^5 + 144*x^4 + 197*x^3 + 123*x^2 + 122*x + 153", field=GF) - assert A.characteristic_poly() == poly - - GF = galois.GF(3**5) - A = GF([[205, 151, 28, 234, 237], [187, 205, 23, 201, 177], [133, 167, 56, 192, 168], [44, 167, 127, 15, 126], [34, 11, 88, 86, 15]]) - poly = galois.Poly.String("x^5 + 239*x^4 + 3*x^3 + 29*x^2 + 118*x + 103", field=GF) - assert A.characteristic_poly() == poly - - -def test_6x6(): - GF = galois.GF(2**8) - A = GF([[106, 204, 100, 114, 255, 156], [177, 52, 157, 96, 41, 49], [140, 183, 80, 216, 194, 75], [52, 241, 143, 47, 91, 112], [50, 56, 135, 120, 177, 128], [3, 115, 180, 212, 216, 137]]) - poly = galois.Poly.String("x^6 + 25*x^5 + 62*x^4 + 168*x^3 + 79*x^2 + 9*x + 152", field=GF) - assert A.characteristic_poly() == poly - - GF = galois.GF(3**5) - A = GF([[200, 6, 74, 9, 150, 111], [41, 36, 116, 208, 206, 80], [168, 180, 9, 112, 188, 116], [65, 170, 113, 61, 227, 210], [194, 68, 154, 240, 145, 9], [167, 55, 64, 23, 55, 18]]) - poly = galois.Poly.String("x^6 + 5*x^5 + 200*x^4 + 205*x^3 + 210*x^2 + 157*x + 107", field=GF) - assert A.characteristic_poly() == poly