Skip to content

Commit 76a978b

Browse files
committed
updated for new Oscar
coprime BB has new bug
1 parent c52fe61 commit 76a978b

30 files changed

+983
-479
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ learninggit.txt
1818
docs/.DS_Store
1919
*.txt
2020
typestest.jl
21+
simd_add_mul_wt_benchmarks.txt
2122

2223
# profiling output stuff:
2324
*.pb.gz

Manifest.toml

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
julia_version = "1.10.5"
44
manifest_format = "2.0"
5-
project_hash = "2d6645f27d1e47bd5cddd8a51982054007baf2cb"
5+
project_hash = "163f71688893b1a2d676f6ba6e175eb2cf6dfafe"
66

77
[[deps.ASL_jll]]
88
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -12,9 +12,9 @@ version = "0.1.3+0"
1212

1313
[[deps.AbstractAlgebra]]
1414
deps = ["InteractiveUtils", "LinearAlgebra", "MacroTools", "Preferences", "Random", "RandomExtensions", "SparseArrays", "Test"]
15-
git-tree-sha1 = "45e46834b8fcfd59389939445267047577b19df5"
15+
git-tree-sha1 = "f7cd148a76ce9668c3fe36f29fcc9201adf14265"
1616
uuid = "c3fe647b-3220-5bb0-a1ea-a7954cac585d"
17-
version = "0.43.1"
17+
version = "0.43.5"
1818

1919
[[deps.AbstractFFTs]]
2020
deps = ["LinearAlgebra"]
@@ -32,9 +32,9 @@ version = "1.5.0"
3232

3333
[[deps.AlgebraicSolving]]
3434
deps = ["LinearAlgebra", "Logging", "Markdown", "Nemo", "Printf", "Random", "StaticArrays", "Test", "msolve_jll"]
35-
git-tree-sha1 = "59b14f801f508a03b0643713b22c4696bc52e445"
35+
git-tree-sha1 = "c68379967797de6ef0a9314f6c66d0803c455d48"
3636
uuid = "66b61cbe-0446-4d5d-9090-1ff510639f9d"
37-
version = "0.7.0"
37+
version = "0.7.2"
3838

3939
[[deps.AliasTables]]
4040
deps = ["PtrArrays", "Random"]
@@ -56,10 +56,9 @@ version = "0.4.0"
5656
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
5757

5858
[[deps.AutoHashEquals]]
59-
deps = ["Pkg"]
60-
git-tree-sha1 = "daaeb6f7f77b88c072a83a2451801818acb5c63b"
59+
git-tree-sha1 = "4ec6b48702dacc5994a835c1189831755e4e76ef"
6160
uuid = "15f4f7f2-30c1-5605-9d31-71845cf9641f"
62-
version = "2.1.0"
61+
version = "2.2.0"
6362

6463
[[deps.Base64]]
6564
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
@@ -135,9 +134,9 @@ uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
135134

136135
[[deps.Distributions]]
137136
deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"]
138-
git-tree-sha1 = "e6c693a0e4394f8fda0e51a5bdf5aef26f8235e9"
137+
git-tree-sha1 = "d7477ecdafb813ddee2ae727afa94e9dcb5f3fb0"
139138
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
140-
version = "0.25.111"
139+
version = "0.25.112"
141140

142141
[deps.Distributions.extensions]
143142
DistributionsChainRulesCoreExt = "ChainRulesCore"
@@ -168,9 +167,9 @@ version = "1.8.0"
168167

169168
[[deps.FFTW_jll]]
170169
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
171-
git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea"
170+
git-tree-sha1 = "4d81ed14783ec49ce9f2e168208a12ce1815aa25"
172171
uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
173-
version = "3.3.10+0"
172+
version = "3.3.10+1"
174173

175174
[[deps.FLINT_jll]]
176175
deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "MPFR_jll", "OpenBLAS32_jll"]
@@ -195,15 +194,15 @@ weakdeps = ["PDMats", "SparseArrays", "Statistics"]
195194

196195
[[deps.GAP]]
197196
deps = ["AbstractAlgebra", "Artifacts", "Compat", "Downloads", "GAP_jll", "GAP_lib_jll", "GAP_pkg_juliainterface_jll", "InteractiveUtils", "Libdl", "MacroTools", "Markdown", "Ncurses_jll", "Pidfile", "Pkg", "REPL", "Random", "Scratch"]
198-
git-tree-sha1 = "b045754f9aae9f79df4b18b2e4df84887897105d"
197+
git-tree-sha1 = "e251aa4e3693eed790e2ee77ec0126e128894a56"
199198
uuid = "c863536a-3901-11e9-33e7-d5cd0df7b904"
200-
version = "0.11.4"
199+
version = "0.12.0"
201200

202201
[[deps.GAP_jll]]
203202
deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Readline_jll", "Zlib_jll"]
204-
git-tree-sha1 = "becf60c941de1c38cea3dd76562c1c1d99052745"
203+
git-tree-sha1 = "eafd1208ec56d6b5d2a996adb7f0518652d68d4c"
205204
uuid = "5cd7a574-2c56-5be2-91dc-c8bc375b9ddf"
206-
version = "400.1300.102+0"
205+
version = "400.1300.102+2"
207206

208207
[[deps.GAP_lib_jll]]
209208
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -213,9 +212,9 @@ version = "400.1300.100+0"
213212

214213
[[deps.GAP_pkg_juliainterface_jll]]
215214
deps = ["Artifacts", "GAP_jll", "GAP_lib_jll", "JLLWrappers", "Libdl"]
216-
git-tree-sha1 = "786044766785f5f2192f45de19acae5d1bb8885d"
215+
git-tree-sha1 = "72b707423fa4267ef7544ae012509bb1613ea5c8"
217216
uuid = "ba154793-3a7d-51ee-8800-e295b0cf7374"
218-
version = "0.900.100+0"
217+
version = "0.1200.0+0"
219218

220219
[[deps.GLPK_jll]]
221220
deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"]
@@ -230,15 +229,15 @@ version = "6.2.1+6"
230229

231230
[[deps.Graphs]]
232231
deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
233-
git-tree-sha1 = "ebd18c326fa6cee1efb7da9a3b45cf69da2ed4d9"
232+
git-tree-sha1 = "1dc470db8b1131cfc7fb4c115de89fe391b9e780"
234233
uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
235-
version = "1.11.2"
234+
version = "1.12.0"
236235

237236
[[deps.Hecke]]
238237
deps = ["AbstractAlgebra", "Dates", "Distributed", "InteractiveUtils", "LazyArtifacts", "Libdl", "LinearAlgebra", "Markdown", "Nemo", "Pkg", "Printf", "Random", "RandomExtensions", "Serialization", "SparseArrays"]
239-
git-tree-sha1 = "9257286b6ada9e8d0ae2a629bf13c51a149c5562"
238+
git-tree-sha1 = "00a2e1d65c458948530c3c68ab519e6b7b80f053"
240239
uuid = "3e1990a7-5d81-5526-99ce-9ba3ff248f21"
241-
version = "0.34.3"
240+
version = "0.34.4"
242241
weakdeps = ["GAP", "Polymake"]
243242

244243
[deps.Hecke.extensions]
@@ -247,9 +246,9 @@ weakdeps = ["GAP", "Polymake"]
247246

248247
[[deps.Hwloc_jll]]
249248
deps = ["Artifacts", "JLLWrappers", "Libdl"]
250-
git-tree-sha1 = "5e19e1e4fa3e71b774ce746274364aef0234634e"
249+
git-tree-sha1 = "dd3b49277ec2bb2c6b94eb1604d4d0616016f7a6"
251250
uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
252-
version = "2.11.1+0"
251+
version = "2.11.2+0"
253252

254253
[[deps.HypergeometricFunctions]]
255254
deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"]
@@ -315,9 +314,9 @@ version = "18.1.7+0"
315314

316315
[[deps.LZO_jll]]
317316
deps = ["Artifacts", "JLLWrappers", "Libdl"]
318-
git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d"
317+
git-tree-sha1 = "854a9c268c43b77b0a27f22d7fab8d33cdb3a731"
319318
uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac"
320-
version = "2.10.2+0"
319+
version = "2.10.2+1"
321320

322321
[[deps.LazyArtifacts]]
323322
deps = ["Artifacts", "Pkg"]
@@ -375,9 +374,9 @@ uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
375374

376375
[[deps.Lz4_jll]]
377376
deps = ["Artifacts", "JLLWrappers", "Libdl"]
378-
git-tree-sha1 = "7f26c8fc5229e68484e0b3447312c98e16207d11"
377+
git-tree-sha1 = "abf88ff67f4fd89839efcae2f4c39cbc4ecd0846"
379378
uuid = "5ced341a-0733-55b8-9ab6-a4889d929147"
380-
version = "1.10.0+0"
379+
version = "1.10.0+1"
381380

382381
[[deps.METIS_jll]]
383382
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -434,19 +433,19 @@ version = "1.25.1+0"
434433

435434
[[deps.Mongoc]]
436435
deps = ["Dates", "DecFP", "MongoC_jll", "Serialization"]
437-
git-tree-sha1 = "f47bf7ed9d9c1da0a632777ca7dc406e3ad5f923"
436+
git-tree-sha1 = "1f0d7579d1bacc1446751990d7e0c4c0bf0f3277"
438437
uuid = "4fe8b98c-fc19-5c23-8ec2-168ff83495f2"
439-
version = "0.9.0"
438+
version = "0.9.1"
440439

441440
[[deps.MozillaCACerts_jll]]
442441
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
443442
version = "2023.1.10"
444443

445444
[[deps.Ncurses_jll]]
446445
deps = ["Artifacts", "JLLWrappers", "Libdl"]
447-
git-tree-sha1 = "3ac1ca10bae513c9cc8f83d7734b921b8007b574"
446+
git-tree-sha1 = "3690e6c58c16ba676bcc9b5654762fe8a05db1c7"
448447
uuid = "68e3532b-a499-55ff-9963-d1c0c0748b3a"
449-
version = "6.5.0+0"
448+
version = "6.5.0+1"
450449

451450
[[deps.Nemo]]
452451
deps = ["AbstractAlgebra", "FLINT_jll", "Libdl", "LinearAlgebra", "Pkg", "Random", "RandomExtensions", "SHA"]
@@ -499,7 +498,7 @@ version = "1.6.3"
499498

500499
[[deps.Oscar]]
501500
deps = ["AbstractAlgebra", "AlgebraicSolving", "Distributed", "GAP", "Hecke", "JSON", "JSON3", "LazyArtifacts", "Markdown", "Nemo", "Pkg", "Polymake", "Random", "RandomExtensions", "Serialization", "Singular", "TOPCOM_jll", "UUIDs", "cohomCalg_jll"]
502-
git-tree-sha1 = "6e9ad54815c837a1a27d19280dddfca5f0f5bf03"
501+
git-tree-sha1 = "9aec1c8a631d474902d1274d6b4d683e4ae22357"
503502
repo-rev = "master"
504503
repo-url = "https://github.com/oscar-system/Oscar.jl.git"
505504
uuid = "f1435218-dba5-11e9-1e4d-f1a5fab5fc13"
@@ -542,9 +541,9 @@ version = "1.10.0"
542541

543542
[[deps.Polymake]]
544543
deps = ["AbstractAlgebra", "BinaryWrappers", "CxxWrap", "Downloads", "JSON", "Libdl", "Mongoc", "NetworkOptions", "Ninja_jll", "Perl_jll", "Pidfile", "Pkg", "REPL", "Scratch", "SparseArrays", "TOPCOM_jll", "lib4ti2_jll", "libpolymake_julia_jll", "polymake_jll", "polymake_oscarnumber_jll"]
545-
git-tree-sha1 = "fa518c47ef32714e99cb0915c45b564fb91fe5bc"
544+
git-tree-sha1 = "e065263f7e818a419bdc89979d7196222bb70efb"
546545
uuid = "d720cf60-89b5-51f5-aff5-213f193123e7"
547-
version = "0.11.21"
546+
version = "0.11.22"
548547

549548
[[deps.PrecompileTools]]
550549
deps = ["Preferences"]
@@ -601,9 +600,9 @@ version = "0.4.4"
601600

602601
[[deps.Readline_jll]]
603602
deps = ["Artifacts", "JLLWrappers", "Libdl", "Ncurses_jll"]
604-
git-tree-sha1 = "9d70e0c890a6c7ca3eb1ca0eaabba4d34795b7fb"
603+
git-tree-sha1 = "69684dc9c2c69f7c515097841991362cca0739ea"
605604
uuid = "05236dd9-4125-5232-aa7c-9ec0c9b2c25a"
606-
version = "8.2.1+0"
605+
version = "8.2.1+1"
607606

608607
[[deps.Reexport]]
609608
git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
@@ -659,15 +658,15 @@ version = "0.9.4"
659658

660659
[[deps.Singular]]
661660
deps = ["AbstractAlgebra", "BinaryWrappers", "CxxWrap", "Libdl", "LinearAlgebra", "Nemo", "Pidfile", "Pkg", "Random", "RandomExtensions", "Singular_jll", "Statistics", "lib4ti2_jll", "libsingular_julia_jll"]
662-
git-tree-sha1 = "9b6135b5c8081f83eb2c334d7a7b903c2076aef7"
661+
git-tree-sha1 = "bc00189bb74b6a3f774253064f945d09fb1668ab"
663662
uuid = "bcd08a7b-43d2-5ff7-b6d4-c458787f915c"
664-
version = "0.23.7"
663+
version = "0.23.8"
665664

666665
[[deps.Singular_jll]]
667666
deps = ["Artifacts", "FLINT_jll", "GMP_jll", "JLLWrappers", "Libdl", "MPFR_jll", "cddlib_jll"]
668-
git-tree-sha1 = "052417021e25f7aca4e81e17f5e12feb53f7ef00"
667+
git-tree-sha1 = "6c85174749476dcd3f059a33884072d748033263"
669668
uuid = "43d676ae-4934-50ba-8046-7a96366d613b"
670-
version = "404.0.605+0"
669+
version = "404.0.606+0"
671670

672671
[[deps.Sockets]]
673672
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
@@ -805,9 +804,9 @@ version = "1.2.13+1"
805804

806805
[[deps.Zstd_jll]]
807806
deps = ["Artifacts", "JLLWrappers", "Libdl"]
808-
git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b"
807+
git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b"
809808
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
810-
version = "1.5.6+0"
809+
version = "1.5.6+1"
811810

812811
[[deps.bliss_jll]]
813812
deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"]
@@ -858,9 +857,9 @@ version = "0.12.1+0"
858857

859858
[[deps.libsingular_julia_jll]]
860859
deps = ["Artifacts", "JLLWrappers", "Libdl", "Singular_jll", "libcxxwrap_julia_jll"]
861-
git-tree-sha1 = "55003499aa923d492234577898643b0e1e471e9d"
860+
git-tree-sha1 = "436efe88c41337fd128062555fe8f8ea6c0e7309"
862861
uuid = "ae4fbd8f-ecdb-54f8-bbce-35570499b30e"
863-
version = "0.45.4+0"
862+
version = "0.45.6+0"
864863

865864
[[deps.lrslib_jll]]
866865
deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"]
@@ -916,6 +915,6 @@ version = "0.3.1+0"
916915

917916
[[deps.snappy_jll]]
918917
deps = ["Artifacts", "JLLWrappers", "LZO_jll", "Libdl", "Lz4_jll", "Zlib_jll"]
919-
git-tree-sha1 = "8bc7ddafc0a7339b82a06c1dde849cd5039324d6"
918+
git-tree-sha1 = "d34e37153e4c03205bde2f0f8ada6cced8c83978"
920919
uuid = "fe1e1685-f7be-5f59-ac9f-4ca204017dfd"
921-
version = "1.2.0+0"
920+
version = "1.2.1+0"

docs/build.zip

-469 KB
Binary file not shown.

docs/src/Tutorials/min_dist.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Minimum Distance Solvers
2+
3+
There are numerous
4+
most work by repeatedly generating codewords, some randomly, some deterministically and systematically
5+
6+
# Background
7+
## Classical
8+
Recall that for linear codes the minimum distance is equal to the minimum weight. It is therefore always valid to compute every element of the code one-by-one by constructing all possible combinations of the generators of the generator matrix, computing their weights, and then returning the minimum. This takes exponential time. Vardy showed that the computation of the minimum distance is NP-Hard and the corresponding decision problem is NP-Complete \cite{vardy1997intractability}, so we can't expect a polynomial-time algorithm but we can do better than brute force. There are two main minimum-weight algorithms in the literature: the Brouwer-Zimmermann (BZ) algorithm and Leon's algorithm \cite{leon1988probabilistic}. The latter is probabilistic and returns the minimum weight with high confidence for a binary linear code.
9+
10+
Consider an $[n, k, d]$ code. The BZ algorithm (roughly) works by enumerating every length-$k$ vector of weight $w$ for $1 \leq w \leq k$. After all vectors of a given weight are processed, a lower bound on the distance is increased. The algorithm also keeps an upper bound equal to the smallest weight codeword it has found so far. The algorithm terminates when the lower bound meets the upper bound. Usually this implies that a codeword of weight equal to the upper bound has been found. However, this library maintains an internal system of bounds on the distance for each code. Hence, it is possible that an upper bound has been previously computed by another method which had not yet been attained by a codeword during the BZ algorithm. Codewords acheiving the distance (or bound) are always returned with the weight whenever possible; otherwise they return the weight and `missing`.
11+
12+
In contrast to BZ's deterministic and systematic approach, some algorithms repeatedly generate random codewords. The lowest-weight codeword generated provides an upper bound on the distance. If the sampling is done well, a large number of iterations can provide a close bound on the distance with high probabiliity. This technique cannot provide a lower bound, so there is no way to terminate early or guarantee the answer is correct without obtaining a bound by other means. In particular, this approach can be combined with the BZ aglorithm to try to generate a codeword or lower an upper bound given BZ's lower bound. Bounds are automatically updated internally, although this may not be possible if a method is terminated prematurely by the user. Bounds from a previous run will be used in any subesquent runs.
13+
14+
## Quantum
15+
The situation is much different in the quantum case. Recall that the minimum distance is given by the minimum weight of a non-trivial logical operator \eqref{dQECC}. This generally has nothing to do with the minimum distance of the corresponding stabilizer code considered as a classical, additive code. Note that $\mathcal{C}_{\mathcal{P}_n}(\mathcal{S}) \backslash \mathcal{S}$ is a set-difference of size $p^{n + k} - p^{n - k}$ and not a quotient module of size $p^{2k}$. Constructing a basis for the centralizer is an easy row reduction but enumerating its elements are not as easy as before. The brute-force method always works but the concept of an information set is now more complicated since one cannot row reduce down to the identity. White and Grassl tackled this in \cite{white2006enumeration, white2006new} where they map the additive code onto a linear code in a way that the minimum of distance of the additive code may be implied from that of the linear code. This mapping increases the parameters from $n$ to $3n$ and $d$ to $2d$, dramatically increasing the overall runtime of the BZ algorithm. Further complicating the quantum case, once a minimal weight vector is detected, one must check to see if it is an element of $S$.
16+
17+
To see how classical intuition can be harmful here, recall that the rotated surface code of distance $d$ has many weight-two elements. The Steane code also has minimum distance three despite having all elements of weight four. These apparent inconsistencies go back to the fact that stabilizer codes are specified by their parity-check matrices but the distances are determined by the dual. In general, low-weight elements are necessary for quantum codes to perform well against certain types of errors \cite{hu2021mitigating}.
18+
19+
often faster to bound dx/dz and then take min
20+
21+
# Methods
22+
## Classical
23+
24+
25+
Note that it is sometimes cheaper to compute the weight enumerator of the dual code then use the MacWilliams identities to compute the desired distance. The method `minimum_distance(C)` attempts to automatically determine which algorithm...
26+
27+
28+
use subfield subcode to bound
29+
30+
## Quantum
31+
32+
exact algorithms
33+
lower bounds w/ Gray code
34+
upper bounds w/ random information sets
35+
native QDistRnd but also interface to original GAP version
36+
graph states

ext/JLD2Ext/Quantum/misc_known_codes.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ function CodingTheory.TriangularColorCode488(d::Int)
3737
elseif d == 19
3838
@load joinpath(path, "488d19stabslogs_trellis.jld2") S l
3939
end
40-
F = CodingTheory.Oscar.GF(2)
40+
F = CodingTheory.Oscar.Nemo.Native.GF(2)
4141
Q = StabilizerCode(CodingTheory.Oscar.matrix(F, S))
4242
set_logicals!(Q, CodingTheory.Oscar.matrix(F, l))
4343
set_minimum_distance!(Q, d)
@@ -80,7 +80,7 @@ function CodingTheory.TriangularColorCode666(d::Int)
8080
elseif d == 21
8181
@load joinpath(path, "666d21stabslogs_trellis.jld2") S l
8282
end
83-
F = CodingTheory.Oscar.GF(2)
83+
F = CodingTheory.Oscar.Nemo.Native.GF(2)
8484
Q = StabilizerCode(CodingTheory.Oscar.matrix(F, S))
8585
set_logicals!(Q, CodingTheory.Oscar.matrix(F, l))
8686
set_minimum_distance!(Q, d)

ext/MakieExt/LDPC/analysis.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Return a plot of the EXIT chart for the ensemble given the channel up to a numer
1717
- Run `using Makie` to activate this extension.
1818
"""
1919
function CodingTheory.EXIT_chart_plot(E::LDPCEnsemble, Ch::AbstractClassicalNoiseChannel; tol::Float64 = 1e-9)
20+
2021
@assert isa(Ch, BinaryErasureChannel) "Only BEC is implemented so far"
2122
x = 0:0.01:1
2223
c = 1 .- [CodingTheory._poly_eval(x, E.ρ) for x in 1 .- x]

0 commit comments

Comments
 (0)