flagrs
This is an experimental project parallel to my
PyNTL project where I attempt to reimplement
parts from my flagmining library as CPython extension code in Rust.
Is designed to be fast. Uses the rug library as a lightweight wrapper around
GMP.
Due to some lacking functionality in rust-cpython==0.6.0 it depends on my own
fork of said project, so you probably won't be able to compile it.
ZZ : ℤ
Normal Integer Operations
x+y -> n, x-y -> n, x*y -> n
Normal addition, subtraction, and multiplication.
x//y -> q, x%y -> r, divmod(x,y) -> (q,r)
Integers act Euclidean.
x**e, pow(x,e)
Normal exponentiation. e must be a natural number (i.e. non-negative integer).
bool(x), x.__bool__() -> bool
Numbers are true if they're non-zero.
n.sqrt() -> (w,r)
Floored integer square root with remainder. w*w + r == n.
n.root(d) -> (w,r)
Floored integer dth root with remainder. w**d + r == n.
-x
Negation.
abs(x)
Absolute value.
x.sign() -> s
The sign (also called signum) of x (-1, 0, or 1).
Bitwise Operations
x|y, x&y, x^y
Bitwise OR, AND, and XOR.
~x
Bitwise negation, acting as if the integer had infinite width. Equivalent to -x-1.
x<<i, x>>i
Bit shifts (can be negative).
n.nbits() -> c
Number of bits needed to represent the absolute value of n.
A synonym for n.bit_length() or len(n).
n.weight() -> c
Number of bits set in the absolute value of n.
n.truncate(bits, [signed=False])
Truncate n to the given number of bits. Negative numbers are treated as if
they're in two's-complement form for the given bit width.
If signed is True the resulting bits will be re-interpreted as a signed
value and so the result might be negative.
n.next_bit() -> b
Next power-of-two bigger than n.
list(n) -> [bool...].
Integers also function implicitly as a list of bits, from least significant to most significant.
>>> list(ZZ(256+16+1))
[True, False, False, False, True, False, False, False, True]
n[i] -> bool
Checks bit i (0-indexed).
n[i:j] -> v
Returns a number with the bits set in the slice.
Morally equivalent to (n>>i) % (1<<j-i) but supports full slice syntax, including negative numbers.
TODO: rust-cpython doesn't have PySlice objects!
Representation
str(x) -> str, x.__repr__()
Number in base-10 as a text string.
x.nbytes() -> l
Number of bytes needed to represent the number. For positive numbers this is
equivalent to (x.nbits() + 7)//8. Negative numbers might require an extra
bit (see x.bytes()).
x.bytes([order='big']) -> bytes
Interprets the number as base-256 and returns the digits as a bytestring.
Negative numbers are treated as if they're in two's complement representation
of the minimum bit width that will successfully represent them, so -128
gives b'\x80' and -129 gives b'\xff\x7f'.
x.digits(base) -> [d...]
Yields a list of digits in base base. The base can be negative, but must have a magnitude of 2 or more.
Modular Arithmetic
n.inv_mod(m) -> r
Returns $1/n \pmod m$.
pow(x,e,m)
Exponentiation under a modulus. e can be negative if gcd(x,m) == 1.
a.kronecker(n) -> k
Kronecker symbol $$(\frac{a}{n})$$. For primes it corresponds to the Legendre symbol.
m.M -> <ZMod type>
Access to the modular numbers using the given number as modulus. See below for ZMod.
>>> F = ZZ(13).M
>>> F(3) * 5
(2)
Factors
n.gcd(m...) -> g
Returns the GCD of n with all arguments.
n.egcd(m) -> (g,x,y)
Extended GCD yielding BeÌzout coefficients. x*n + m*y == g.
n.lcm(m...) -> m
Returns the LCM of n with all arguments.
n.is_prime([reps=25]) -> bool
Trivial divisors, then Baille-PSW, then $(reps-24)$ rounds of Miller-Rabin.
n.next_prime() -> p
Returns the next prime larger than n.
n.make_odd() -> (q,e)
Returns the odd part and exponent of 2 in n. 2**e * q == n
n.small_factors([upto=0x100000]) -> (q,[(p,e)...])
Factors out all primes smaller than upto.
Returns the remaining factor q and a list of primes and their multiplicity.
x.factor_pollard(upto)
...
x.factor_fermat(s, e)
...
ZMod : ℤ_n
Represents the residue ring (or field) of integers under a given modulus. The normal arithmetic works as expected. In cases where a field is required for the operation to be well-defined, the code will simply assume the user knows what they're doing and operate under the assumption that it is (i.e. that the modulus is prime).
x/y -> z
Normal division works as expected:
>>> F = ZMod(17)
>>> F(5)/2
(11)
>>> F(11)*2
(5)
x**e -> y
Exponentiation also works as expected:
>>> ZMod(17179)(2)**0xdeadcafe
(14537)
p.EC(a,b) -> <EC type>
Access to the additive group of an Elliptic Curve using this modulus.
EC : Ellipic Curves
Metadata
Release files for flagrs 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| flagrs-0.1.4-cp39-cp39-manylinux_2_24_x86_64.whl | CPython 3.9 | CPython 3.9 | Linux glibc 2.24+ x86-64 | Details for flagrs-0.1.4-cp39-cp39-manylinux_2_24_x86_64.whl |
| flagrs-0.1.4-cp38-cp38-manylinux_2_24_x86_64.whl | CPython 3.8 | CPython 3.8 | Linux glibc 2.24+ x86-64 | Details for flagrs-0.1.4-cp38-cp38-manylinux_2_24_x86_64.whl |
| flagrs-0.1.4-cp37-cp37m-manylinux_2_24_x86_64.whl | CPython 3.7 | CPython 3.7 pymalloc | Linux glibc 2.24+ x86-64 | Details for flagrs-0.1.4-cp37-cp37m-manylinux_2_24_x86_64.whl |
Total release size: 1.2 MB
Release files / flagrs-0.1.4-cp39-cp39-manylinux_2_24_x86_64.whl
| Download URL | flagrs-0.1.4-cp39-cp39-manylinux_2_24_x86_64.whl |
|---|---|
| Size | 414.9 kB |
| Tags | CPython 3.9 Linux glibc 2.24+ x86-64 |
|
SHA-256 checksum How to use checksums |
959e34f890bae63624880b94dd62a12afc68070d155c71ea5ec07b72419b77d7
|
|
BLAKE2b-256 checksum How to use checksums |
0b66ed51494a0b0e68f1b6ffaf59cc83755f936f0d7ca836c454a4dd59a19c27
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/0.11.3
|
Release files / flagrs-0.1.4-cp38-cp38-manylinux_2_24_x86_64.whl
| Download URL | flagrs-0.1.4-cp38-cp38-manylinux_2_24_x86_64.whl |
|---|---|
| Size | 414.8 kB |
| Tags | CPython 3.8 Linux glibc 2.24+ x86-64 |
|
SHA-256 checksum How to use checksums |
001550bd5e2be348b238eb9be733f1a03598e33fdd5dc2defbcad887c0332dda
|
|
BLAKE2b-256 checksum How to use checksums |
d838fe6ba7e35e1ced27a7906af166c3a6066dd8bc4c0f2d0e7c346796259c0b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/0.11.3
|
Release files / flagrs-0.1.4-cp37-cp37m-manylinux_2_24_x86_64.whl
| Download URL | flagrs-0.1.4-cp37-cp37m-manylinux_2_24_x86_64.whl |
|---|---|
| Size | 414.8 kB |
| Tags | CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.24+ x86-64 |
|
SHA-256 checksum How to use checksums |
7be1530e6597233aac6c9b37d7ea5520f068902b1157681e7492c13605aa504e
|
|
BLAKE2b-256 checksum How to use checksums |
610a790e6adf47aac99f322b96881f29cb929015a3b43ea13635716eaa22e734
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/0.11.3
|
Security for flagrs 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.