Skip to main content

Find any nontrivial factor of a number

Project description

FindAFactor

Find any nontrivial factor of a number

PyPI Downloads

Copyright and license

(c) Daniel Strano and the Qrack contributors 2017-2025. All rights reserved.

Installation

From PyPi:

pip3 install FindAFactor

From Source: install pybind11, then

pip3 install .

in the root source directory (with setup.py).

Windows users might find Windows Subsystem Linux (WSL) to be the easier and preferred choice for installation.

Usage

from FindAFactor import find_a_factor, FactoringMethod

to_factor = 1000

factor = find_a_factor(
    to_factor,
    method=FactoringMethod.PRIME_SOLVER,
    node_count=1, node_id=0,
    gear_factorization_level=11,
    wheel_factorization_level=11,
    sieving_bound_multiplier=1.0,
    smoothness_bound_multiplier=1.0,
    gaussian_elimination_row_multiplier=1.2,
    check_small_factors=False
)

The find_a_factor() function should return any nontrivial factor of to_factor (that is, any factor besides 1 or to_factor) if it exists. If a nontrivial factor does not exist (i.e., the number to factor is prime), the function will return 1 or the original to_factor.

  • method (default value: PRIME_SOLVER/0): PRIME_SOLVER/0 will prove that a number is prime (by failing to find any factors with wheel and gear factorization). FACTOR_FINDER/1 is optimized for the assumption that the number has at least two nontrivial factors.
  • node_count (default value: 1): FindAFactor can perform factorization in a distributed manner, across nodes, without network communication! When node_count is set higher than 1, the search space for factors is segmented equally per node. If the number to factor is semiprime, and brute-force search is used instead of congruence of squares, for example, all nodes except the one that happens to contain the (unknown) prime factor less than the square root of to_factor will ultimately return 1, while one node will find and return this factor. For best performance, every node involved in factorization should have roughly the same CPU throughput capacity. For FACTOR_FINDER mode, this splits the sieving range between nodes, but it does not actually coordinate Gaussian elimination rows between nodes.
  • node_id (default value: 0): This is the identifier of this node, when performing distributed factorization with node_count higher than 1. node_id values start at 0 and go as high as (node_count - 1).
  • gear_factorization_level (default value: 1): This is the value up to which "wheel (and gear) factorization" are applied to "brute force." A value of 11 includes all prime factors of 11 and below and works well for PRIME_PROVER, though significantly higher might be preferred in certain cases.
  • wheel_factorization_level (default value: 1): "Wheel" vs. "gear" factorization balances two types of factorization wheel ("wheel" vs. "gear" design) that often work best when the "wheel" is only a few prime number levels lower than gear factorization. Optimized implementation for wheels is only available up to 13. The primes above "wheel" level, up to "gear" level, are the primes used specifically for "gear" factorization. Wheel factorization is also applied to map the sieving intervale of FACTOR_FINDER mode onto non-multiples on the wheel, if the level is set above 1 (which might not actually pay dividends in practical complexity, but we leave it for your experimentation). In FACTOR_FINDER mode, wheel factorization multiples are systematically avoided by construction, while gear factorization multiples are just rejected after-the-fact, without special construction to avoid them. (It is possible in theory to implement handling for gear factorization by construction, though, and that might be added in a future release.)
  • sieving_bound_multiplier (default value: 1.0): This controls the sieving bound and is calibrated such that it linearly multiplies the square root of the number to factor (for each 1.0 increment). While this might be a huge bound, remember that sieving termination is primarily controlled by when gaussian_elimination_row_multiplier is exactly satisfied.
  • smoothness_bound_multiplier (default value: 1.0): This controls smoothness bound and is calibrated such that it linearliy multiplies exp(0.5 * std::sqrt(log(N) * log(log(N)))) for N being the number to factor (for each 1.0 increment). This was a heuristic suggested by Elara (an OpenAI custom GPT).
  • gaussian_elimination_row_multiplier (default value: 1.0): This controls the number of rows sieved for Gaussian elimination before terminating the sieve and is calibrated such that it linearly multiplies one plus the number of smooth prime columns in the Gaussian elimination matrix (for each 1.0 increment). So long as this setting is appropriately low enough, sieving_bound_multiplier can be set basically arbitrarily high.
  • check_small_factors (default value: False): True performs initial-phase trial division up to the smoothness bound, and False skips it.

All variables defaults can also be controlled by environment variables:

  • FINDAFACTOR_METHOD (integer value)
  • FINDAFACTOR_NODE_COUNT
  • FINDAFACTOR_NODE_ID
  • FINDAFACTOR_GEAR_FACTORIZATION_LEVEL
  • FINDAFACTOR_WHEEL_FACTORIZATION_LEVEL
  • FINDAFACTOR_SIEVING_BOUND_MULTIPLIER
  • FINDAFACTOR_SMOOTHNESS_BOUND_MULTIPLIER
  • FINDAFACTOR_GAUSSIAN_ELIMINATION_ROW_MULTIPLIER
  • FINDAFACTOR_CHECK_SMALL_FACTORS (True if set at all, otherwise False)

About

This library was originally called "Qimcifa" and demonstrated a (Shor's-like) "quantum-inspired" algorithm for integer factoring. It has since been developed into a general factoring algorithm and tool.

Special thanks to OpenAI GPT "Elara," for help with indicated region of contributed code!

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

findafactor-5.3.0.tar.gz (5.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

FindAFactor-5.3.0-cp313-cp313-macosx_15_0_arm64.whl (117.9 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

FindAFactor-5.3.0-cp313-cp313-macosx_14_0_arm64.whl (117.3 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

FindAFactor-5.3.0-cp313-cp313-macosx_13_0_x86_64.whl (131.8 kB view details)

Uploaded CPython 3.13macOS 13.0+ x86-64

FindAFactor-5.3.0-cp312-cp312-win_amd64.whl (152.2 kB view details)

Uploaded CPython 3.12Windows x86-64

FindAFactor-5.3.0-cp312-cp312-manylinux_2_39_x86_64.whl (142.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

FindAFactor-5.3.0-cp310-cp310-manylinux_2_35_x86_64.whl (147.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.35+ x86-64

FindAFactor-5.3.0-cp38-cp38-manylinux_2_31_x86_64.whl (139.4 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ x86-64

File details

Details for the file findafactor-5.3.0.tar.gz.

File metadata

  • Download URL: findafactor-5.3.0.tar.gz
  • Upload date:
  • Size: 5.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.3

File hashes

Hashes for findafactor-5.3.0.tar.gz
Algorithm Hash digest
SHA256 5c565a1b296f9bcf2747994a5e8ee4f0dbd16edd4bd8fdb7549537c86067202e
MD5 4cb20853009a443de76ef6802f408742
BLAKE2b-256 51a1caa836fba8308ccac14306007dc1d7d4e5ff30b006d9d01e0d818b2a8bc9

See more details on using hashes here.

File details

Details for the file FindAFactor-5.3.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for FindAFactor-5.3.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 da8f4d5580aef77c833bb09c7dc6b40f9e5e188cd1b05c51ae60350a3bc39326
MD5 cf4be0b0aaaddcb2720bd086c4fae0b8
BLAKE2b-256 e6f610f5f0397b00ef895cbcd31b5838ad5ec643e2a5f43b6dc4bb3e959ef345

See more details on using hashes here.

File details

Details for the file FindAFactor-5.3.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for FindAFactor-5.3.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 4807836a358746af5465ef9befe4a21e4d5a4a2da547a628f093b13a35fc2e23
MD5 b4bb4396ff7aa364452769793692978f
BLAKE2b-256 6ca841867334ac82b3bb84c365df6849b334e3a3030438663d9e9053d253c893

See more details on using hashes here.

File details

Details for the file FindAFactor-5.3.0-cp313-cp313-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for FindAFactor-5.3.0-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 081fbc4a33dc430bf16baff41f3dacba02b85ddac929ca27567a3acab8172e3a
MD5 70d563dbe0effeeb0237ecd262c8da21
BLAKE2b-256 114dfbee7a62648d78cb79045194b8bee03defe2550274b2039ddc0f8faa9903

See more details on using hashes here.

File details

Details for the file FindAFactor-5.3.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for FindAFactor-5.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 631a329a27ba7d0d650cdfdab870d7348d6653882a3cbf06e00d63c7a70338a0
MD5 7ce0f029beb37db874b67774d95230c7
BLAKE2b-256 3a704961fd728e1decac41659a8efd6a88104ef0d79dbb23891eed6ba58734c8

See more details on using hashes here.

File details

Details for the file FindAFactor-5.3.0-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for FindAFactor-5.3.0-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 fee329448d4a689f365f4e51901b394ea4e541436a9aa6a7ab6e9a8027e3fff0
MD5 5895ef3d42c5cdff2e83a52a69d19c7b
BLAKE2b-256 488514830f10554fc578bddef98609449d582e528dd10eed82d1cb500e603569

See more details on using hashes here.

File details

Details for the file FindAFactor-5.3.0-cp310-cp310-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for FindAFactor-5.3.0-cp310-cp310-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 d5b3a175cfebda1af1826f96a9af6a1fcf85ac20cf8ec23c1b3f8cb8fae70db2
MD5 3f243505ecd822d19aaff0b55ccb0a6d
BLAKE2b-256 64755a42d8b180adeced20e44b9e93c2022cde81d44d3eac75759927de2d135e

See more details on using hashes here.

File details

Details for the file FindAFactor-5.3.0-cp38-cp38-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for FindAFactor-5.3.0-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 025a6260bbc36f042cc1e77c6052789b0f8035dc48edb15593f4809c2e422cbf
MD5 90a5475f5a9d1b930c5eb92ee599b4f9
BLAKE2b-256 8546072cd024b2d84614ff46ad35f8a2a4412b2b45127c92efe0896189f4c79a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page