Observed since 20 Oct, 17:24 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Exact number theory in Python — Bernoulli numbers, Euler zigzag numbers, closed-form zeta(n), and an Euler-product approximation of pi from primes.
A small pure-Python library of exact and semi-exact number theory computations: Bernoulli numbers, Euler (zigzag) numbers, the Riemann zeta function at integers, and a primality/prime-generation toolkit that ties them together into an Euler-product approximation of π.
No dependencies beyond the standard library, except prime.py which uses pycryptodome for a fast Miller-Rabin primality check.
| Module | Purpose |
|---|---|
bernoulli.py | Generates Bernoulli numbers B(n) lazily and exactly as Fractions |
B.py | B(n) — returns the n-th Bernoulli number |
zigzag.py | Computes zigzag (Euler up/down) numbers via dynamic programming |
E.py | E(n) — returns the n-th Euler zigzag number, zigzag(n, n) |
zeta.py | zeta(n) — exact closed form of ζ(n) for even positive and all non-positive integers |
prime.py | isPrime(n) — hybrid primality test (Miller-Rabin via pycryptodome, with optional trial-division fallback) |
nextPrime.py | NP(n) — next prime after n, using a 6k±1 wheel |
piprime.py | piprime(n, iters) — approximates π via the Euler product formula for ζ(n) |
git clone https://github.com/Abhrankan-Chakrabarti/number-theory.git
cd number-theory
pip install -e .
This installs the number_theory package in editable mode along with its one dependency, pycryptodome.
Import the public API directly from the package:
from number_theory import B, E, zeta, isPrime, NP, piprime
B(10) # Fraction(5, 66)
E(4) # 5
zeta(4) # 1/90π⁴ (exact, as a formatted string)
isPrime(97) # True
NP(97) # 101
piprime(2, 1000) # ≈ 3.14157...
Each module can also be run standalone via python -m:
python -m number_theory.bernoulli # prints B(0) through B(60)
python -m number_theory.prime # prompts for n, checks primality
python -m number_theory.nextPrime # prompts for a prime, finds the next one
python -m number_theory.zeta # prompts for n, prints ζ(n)
python -m number_theory.piprime # prompts for n and iteration count, approximates π
number_theory/
├── __init__.py (exposes the public API)
├── piprime.py
│ ├── nextPrime.py → prime.py → Crypto.Util.number (Miller-Rabin)
│ └── zeta.py
│ ├── B.py → bernoulli.py (exact Bernoulli numbers via Fraction)
│ └── E.py → zigzag.py (Euler zigzag numbers via DP table)
Bernoulli numbers (bernoulli.py) are generated with the Akiyama–Tanigawa-style triangle algorithm, yielding exact Fraction values lazily — no floating-point error, no recomputation from scratch for each index.
Zigzag numbers (zigzag.py) count alternating permutations and appear in the odd-argument case of ζ via their connection to tangent/secant numbers.
zeta(n) returns an exact closed form:
zeta.py prints a warning and returns an Euler-number-based expression rather than a proven identitypiprime.py uses the Euler product ζ(n) = ∏ₚ (1 − p⁻ⁿ)⁻¹ over the first iters primes, rearranged to solve for π:
π = ( ∏ₚ(1 − p⁻ⁿ) · ζ(n) )^(−1/n)
Since ζ(n) is known exactly for even n, this converges to π as more primes are included — a nice way to derive π purely from the distribution of primes.
prime.py and nextPrime.py provide the prime stream piprime.py walks over: isPrime uses pycryptodome's Miller-Rabin test by default (fast, probabilistic but effectively certain for practical sizes), with an optional 6k±1 trial-division mode; NP finds the next prime by stepping along the same 6k±1 wheel.
>>> from zeta import zeta
>>> zeta(2)
1/6π²
>>> zeta(4)
1/90π⁴
>>> zeta(-1)
-1/12
>>> zeta(-3)
1/120
>>> from piprime import piprime
>>> piprime(2, 1000)
3.1415727030005223
>>> piprime(2, 100000)
3.14159260...
More iterations (more primes in the product) converge more closely to π, though slowly — this is a demonstration of the identity, not an efficient way to compute π.
zeta.py's odd-n branch returns an Euler-number expression as a placeholder, not a mathematically proven identity. Treat this case as exploratory only.piprime.py converges slowly — it's a demonstration of the Euler product identity, not a practical π-computation algorithm.prime.py's trial-division fallback (r=True, c=False) is only efficient for small n; the default Miller-Rabin path via pycryptodome should be used for anything large.MIT — see LICENSE for details.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 2.0.1 | 8 Jul 2026 | 1 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 17:24 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:0b96c9f19a9ead81e34589e2105fe6792b00cabb7e4ec74396cebab44bf9dd1e