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_PROVER,
    node_count=1, node_id=0,
    gear_factorization_level=23,
    wheel_factorization_level=13,
    sieving_bound_multiplier=1.0,
    smoothness_bound_multiplier=1.0,
    gaussian_elimination_row_offset=3,
    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_PROVER/0): PRIME_PROVER/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: 23): This is the value up to which "wheel (and gear) factorization" are applied to "brute force." A value of 23 includes all prime factors of 23 and below and works well for PRIME_PROVER, though significantly higher might be preferred in certain cases. In FACTOR_FINDER, one probably wants to avoid setting a different gear level than wheel level.
  • wheel_factorization_level (default value: 13): "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. For PRIME_PROVER, optimized implementation for wheels is only available up to 17; for FACTOR_FINDER, wheels are constructed programmatically while avoiding smooth primes with quadratic residues, so there is no fixed ceiling. The primes above "wheel" level, up to "gear" level, are the primes used specifically for "gear" factorization. For FACTOR_FINDER method, wheel factorization is applied to map the sieving interval onto non-multiples on the wheel, if the level is set above 1.
  • sieving_bound_multiplier (default value: 1.0): This controls the sieving bound and is calibrated such that it linearly multiplies the number to factor minus its square root (for a full 1.0 increment, which is maximum). 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 pow(exp(0.5 * sqrt(log(N) * log(log(N)))), sqrt(2.0)/4) 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_offset (default value: 1): This controls the number of rows greater than the count of smooth primes that are sieved before Gaussian elimination. Basically, for each increment starting with 1, the chance of finding at least one solution in Gaussian elimination goes like (1 - 2^(-m)) for a setting value of m: 1 value is a 50% chance of success, and the chance of failure is halved for each unit of 1 added. 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_OFFSET
  • 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

This version

6.5.3

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

findafactor-6.5.3.tar.gz (6.0 kB view details)

Uploaded Source

Built Distributions

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

FindAFactor-6.5.3-cp313-cp313-macosx_15_0_arm64.whl (255.0 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

FindAFactor-6.5.3-cp312-cp312-win_amd64.whl (277.2 kB view details)

Uploaded CPython 3.12Windows x86-64

FindAFactor-6.5.3-cp312-cp312-manylinux_2_39_x86_64.whl (272.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

FindAFactor-6.5.3-cp310-cp310-manylinux_2_35_x86_64.whl (279.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.35+ x86-64

FindAFactor-6.5.3-cp38-cp38-manylinux_2_31_x86_64.whl (271.6 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ x86-64

File details

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

File metadata

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

File hashes

Hashes for findafactor-6.5.3.tar.gz
Algorithm Hash digest
SHA256 dbb7e45b8317ee2dbc66d8bbae809216ed8ccbdfb170b7af13f407910cbb532c
MD5 834c89a73097265523dd308bedf6d91c
BLAKE2b-256 66d478b38da6715952291e7dc01de57c80dcfa05b30823cabe42e77a40e6657f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.5.3-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 759a1c32bf9c526438f84bd8a32b0c5657e9d5bf29228193ea14145c9f2732ae
MD5 469b00eb5bfdb812e39e160311c6e97f
BLAKE2b-256 d0e12527633e8c0acfa7b6b703a0dcbb56f67b06cda64f0616d07ee3bd528e24

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.5.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e4722531a5a4224dc915980dc0ae5283d128b8b05dc8977465eae955869d3d1d
MD5 b61501b4619dfa4a3a5fcfff7037e2ba
BLAKE2b-256 092bb9dd6da226203629147ca9afebf5926d73298c5c6de120fbe241a02c4e83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.5.3-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 ff6f2a0f92ce72268e11bf309b23d724c0091c3a2245e53356d2e114a3211f94
MD5 bdf4b7ed8ef5f8f2e828166fe82126ec
BLAKE2b-256 3d81ddd89f33a0cdd9d69c7b7b0a1db42597bf6887d75b6d6d59a62beccd5bfe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.5.3-cp310-cp310-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 60978336da58a442868a90edbea8df310850b9360a2df1c39b33843c3607d650
MD5 59239c1c51b3c186edb5a8f63dc89f76
BLAKE2b-256 be4142e960a2925643795a25758b18ae069144a5737ff94f10eed454c2beaf4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.5.3-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 cc1a4f94986195b1ffc508ae19f5f05ced5e6448e5b66ed9d1aebbfbdb4ddee9
MD5 338a9d9735a1a9715519b0af4e16ab67
BLAKE2b-256 52186f8a7a2a1f06c61aa24a6a0f0c2c76cbb750e3916bfb2ac62d0c71043e22

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