Exact number theory in Python — Bernoulli numbers, Euler zigzag numbers, closed-form zeta(n), and an Euler-product approximation of pi from primes.
Project description
number-theory
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.
Table of Contents
Modules
| 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) |
Installation
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.
Usage
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 π
How It Fits Together
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:
- Positive even n: ζ(n) = (−1)^(n/2+1) · B(n) · 2^(n−1) / n! · πⁿ
- Non-positive n: ζ(n) = (−1)^(−n) · B(1−n) / (1−n) — the "trivial" values, all rational
- Positive odd n: no known closed form exists (this is genuinely open in general — ζ(3) is Apéry's constant);
zeta.pyprints a warning and returns an Euler-number-based expression rather than a proven identity
piprime.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.
Examples
>>> 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 π.
Limitations
- Odd zeta values (ζ(3), ζ(5), ...) have no known closed form in terms of π and rationals;
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.pyconverges 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 smalln; the default Miller-Rabin path viapycryptodomeshould be used for anything large.
License
MIT — see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file abhrankan_number_theory-2.0.1.tar.gz.
File metadata
- Download URL: abhrankan_number_theory-2.0.1.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc43641b6549337e8819a80b7a8148ada6c2cdc5ca488189581d67eabd1f3404
|
|
| MD5 |
6510fcc3b9496794c900ed0c9bcdd37e
|
|
| BLAKE2b-256 |
698951fea18fcbf27dcd757136cbe623186ed936a9dc6d2e7655a1df8ea2aa28
|
File details
Details for the file abhrankan_number_theory-2.0.1-py3-none-any.whl.
File metadata
- Download URL: abhrankan_number_theory-2.0.1-py3-none-any.whl
- Upload date:
- Size: 8.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ffaf580b0fd0dfc484fad464060a9e3b64db3e0d75668f754189ad290bb528d
|
|
| MD5 |
5f40b110f51c30568c3b4075566f148e
|
|
| BLAKE2b-256 |
042a0f27ccfd5d85fbfbda745a6a9a99265fd5b473d9e7ba544c32b439b968fe
|