# v0.3¶

## v0.3.0¶

Released December 9, 2022

### Breaking changes¶

• Increased minimum NumPy version to 1.21.0. (#441)

• Increased minimum Numba version to 0.55.0 (#441)

• Modified galois.GF() and galois.Field() so that keyword arguments irreducible_poly, primitive_element, verify, compile, and repr may no longer be passed as positional arguments. (#442)

### Changes¶

• Added a galois.GF(p, m) call signature in addition to galois.GF(p**m). This also applies to galois.Field(). Separately specifying $$p$$ and $$m$$ eliminates the need to factor the order $$p^m$$ in very large finite fields. (#442)

>>> import galois
# This is faster than galois.GF(2**409)
>>> GF = galois.GF(2, 409)
>>> print(GF.properties)
Galois Field:
name: GF(2^409)
characteristic: 2
degree: 409
order: 1322111937580497197903830616065542079656809365928562438569297590548811582472622691650378420879430569695182424050046716608512
irreducible_poly: x^409 + x^7 + x^5 + x^3 + 1
is_primitive_poly: True
primitive_element: x

• Optimized matrix multiplication by parallelizing across multiple cores. (#440)

In : import galois

In : GF = galois.GF(3**5)

In : A = GF.Random((300, 400), seed=1)

In : B = GF.Random((400, 500), seed=2)

# v0.2.0
In : %timeit A @ B
664 ms ± 3.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# v0.3.0
In : %timeit A @ B
79.1 ms ± 7.32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

• Optimized polynomial evaluation by parallelizing across multiple cores. (#440)

In : import galois

In : GF = galois.GF(3**5)

In : f = galois.Poly.Random(100, seed=1, field=GF)

In : x = GF.Random(100_000, seed=1)

# v0.2.0
In : %timeit f(x)
776 ms ± 2.12 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# v0.3.0
In : %timeit f(x)
13.9 ms ± 2.51 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

• Fixed an occasional arithmetic type error in binary extension fields $$\mathrm{GF}(2^m)$$ when using the built-in np.bitwise_xor(). (#441)

## v0.3.1¶

Released December 12, 2022

### Changes¶

• Fixed a bug in the Pollard $$\rho$$ factorization algorithm that caused an occasional infinite loop. (#450)

In : import galois

# v0.3.0
In : %time galois.GF(2400610585866217)
# Never returns...

# v0.3.1
In : %time galois.GF(2400610585866217)
Wall time: 96 ms
Out: <class 'galois.GF(2400610585866217)'>

• Formatted the code and unit tests with black and isort. (#446, #449)

## v0.3.2¶

Released December 18, 2022

### Changes¶

• Added a prime factorization database for $$n = b^k \pm 1$$, with $$b \in \{2, 3, 5, 6, 7, 10, 11, 12\}$$. The factorizations are from the Cunningham Book. This speeds up the creation of large finite fields. (#452)

In : import galois

# v0.3.1
In : %time galois.factors(2**256 - 1)
# Took forever...

# v0.3.2
In : %time galois.factors(2**256 - 1)
Wall time: 1 ms
Out:
([3,
5,
17,
257,
641,
65537,
274177,
6700417,
67280421310721,
59649589127497217,
5704689200685129054721],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

• Added speed-up when factoring powers of small primes. This speeds up the creation of large finite fields. (#454)

In : import galois

# v0.3.1
In : %time galois.factors(2**471)
Wall time: 4.18 s
Out: (, )

# v0.3.2
In : %time galois.factors(2**471)
Wall time: 2 ms
Out: (, )

• Added four additional Mersenne primes that were discovered between 2013-2018. (#452)

## v0.3.3¶

Released February 1, 2023

### Changes¶

• Added a terms keyword argument to irreducible_poly(), irreducible_polys(), primitive_poly(), and primitive_polys() to find a polynomial with a desired number of non-zero terms. This may be set to an integer or to "min". (#463)

>>> import galois
>>> galois.irreducible_poly(7, 9)
Poly(x^9 + 2, GF(7))
>>> galois.irreducible_poly(7, 9, terms=3)
Poly(x^9 + x + 1, GF(7))
>>> galois.primitive_poly(7, 9)
Poly(x^9 + x^2 + x + 2, GF(7))
>>> galois.primitive_poly(7, 9, terms="min")
Poly(x^9 + 3x^2 + 4, GF(7))

• Added a database of binary irreducible polynomials with degrees less than 10,000. These polynomials are lexicographically-first and have the minimum number of non-zero terms. The database is accessed in irreducible_poly() when terms="min" and method="min". (#462)

In : import galois

# Manual search
In : %time galois.irreducible_poly(2, 1001)
CPU times: user 6.8 s, sys: 0 ns, total: 6.8 s
Wall time: 6.81 s
Out: Poly(x^1001 + x^5 + x^3 + x + 1, GF(2))

# With the database
In : %time galois.irreducible_poly(2, 1001, terms="min")
CPU times: user 745 µs, sys: 0 ns, total: 745 µs
Wall time: 1.4 ms
Out: Poly(x^1001 + x^17 + 1, GF(2))

• Memoized expensive polynomial tests Poly.is_irreducible() and Poly.is_primitive(). Now, the expense of those calculations for a given polynomial is only incurred once. (#470)

In : import galois

In : f = galois.Poly.Str("x^1001 + x^17 + 1"); f
Out: Poly(x^1001 + x^17 + 1, GF(2))

In : %time f.is_irreducible()
CPU times: user 1.05 s, sys: 3.47 ms, total: 1.05 s
Wall time: 1.06 s
Out: True

In : %time f.is_irreducible()
CPU times: user 57 µs, sys: 30 µs, total: 87 µs
Wall time: 68.2 µs
Out: True

• Added tests for Conway polynomials Poly.is_conway() and Poly.is_conway_consistent(). (#469)

• Added the ability to manually search for a Conway polynomial if it is not found in Frank Luebeck’s database, using conway_poly(p, m, search=True). (#469)

• Various documentation improvements.

## v0.3.4¶

Released May 2, 2023

### Changes¶

• Added support for Python 3.11. (#415)

• Added support for NumPy 1.24. (#415)

• Fixed indexing bug in FieldArray.plu_decompose() for certain input arrays. (#477)

## v0.3.5¶

Released May 9, 2023

### Changes¶

• Added py.typed file to indicate to mypy and other type checkers that galois supports typing. (#481)

• Fixed bug with multiple, concurrent BCH and/or Reed Solomon decoders. (#484)

### Contributors¶

Last update: May 09, 2023