algnuth

Algebraic Number Theory package


Keywords
algebra
License
MIT
Install
pip install algnuth==0.0.3

Documentation

travis

Algebraic Number Theory package

Louis Abraham and Yassir Akram

Installation

pip install --upgrade algnuth

or get the development version with:

pip install --upgrade git+https://github.com/louisabraham/algnuth

Features

Jacobi symbol

>>> from algnuth.jacobi import jacobi
>>> jacobi(3763, 20353)
-1

Solovay-Strassen primality test

>>> from algnuth.jacobi import solovay_strassen
>>> p = 12779877140635552275193974526927174906313992988726945426212616053383820179306398832891367199026816638983953765799977121840616466620283861630627224899026453
>>> q = 12779877140635552275193974526927174906313992988726945426212616053383820179306398832891367199026816638983953765799977121840616466620283861630627224899027521
>>> n = p * q
>>> solovay_strassen(p)
True
>>> solovay_strassen(q)
True
>>> solovay_strassen(n)
False

Quadratic forms

>>> from algnuth.quadratic import *
>>> display_classes(-44)
x^2 + 11â‹…y^2
2â‹…x^2 + 2â‹…xy + 6â‹…y^2
3â‹…x^2 - 2â‹…xy + 4â‹…y^2
3â‹…x^2 + 2â‹…xy + 4â‹…y^2
>>> display_primitive_forms(-44)
x^2 + 11â‹…y^2
3â‹…x^2 - 2â‹…xy + 4â‹…y^2
3â‹…x^2 + 2â‹…xy + 4â‹…y^2
>>> display_ambiguous_classes(-44)
x^2 + 11â‹…y^2
2â‹…x^2 + 2â‹…xy + 6â‹…y^2
>>> display(*reduced(18, -10, 2))
2â‹…x^2 + 2â‹…xy + 6â‹…y^2

Real polynomials

>>> from algnuth.polynom import Polynomial
>>> P = Polynomial([0] * 10 + [-1, 0, 1])
>>> print(P)
X^12-X^10
>>> P(2)
3072
>>> P.disc
0
>>> P.sturm() # Number of distinct real roots
3
>>> P.r1 # Number of real roots with multiplicity
12

Modular arithmetic

>>> P = Polynomial([1, 2, 3])
>>> Pmodp = P % 41
>>> print(Pmodp ** 3)
27â‹…X^6+13â‹…X^5+22â‹…X^4+3â‹…X^3+21â‹…X^2+6â‹…X+1
>>> print((P ** 3) % 41)
27â‹…X^6+13â‹…X^5+22â‹…X^4+3â‹…X^3+21â‹…X^2+6â‹…X+1

Polynomial division

>>> A = Polynomial([1, 2, 3, 4]) % 7
>>> B = Polynomial([0, 1, 2]) % 7
>>> print(A)
4â‹…X^3+3â‹…X^2+2â‹…X+1
>>> print(B)
2â‹…X^2+X
>>> print(A % B)
5â‹…X+1
>>> print(A // B)
2â‹…X+4
>>> print((A // B) * B + A % B)
4â‹…X^3+3â‹…X^2+2â‹…X+1

Berlekamp's factorization algorithm

>>> P = Polynomial([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
>>> Pmodp = P % 41
>>> print(Polynomial.ppfactors(Pmodp.factor()))
12â‹…(X+31)â‹…Xâ‹…(X^2+40â‹…X+24)â‹…(X^2+36â‹…X+13)â‹…(X^6+34â‹…X^5+26â‹…X^4+13â‹…X^3+25â‹…X^2+26â‹…X+35)

Unique Factorization of Ideals

>>> from algnuth.ideals import factorIdeals
>>> factorIdeals(Polynomial([4, 0, 0, 1]))
X^3+4 mod 2 = X^3
(2) = (2, α)^3
X^3+4 mod 3 = (X+1)^3
(3) = (3, α+1)^3
X^3+4 mod 5 = (X+4)â‹…(X^2+X+1)
(5) = (5, α+4)⋅(5, α^2+α+1)