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_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_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_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

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.0.0.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.0.0-cp313-cp313-macosx_15_0_arm64.whl (117.9 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

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

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.13macOS 13.0+ x86-64

FindAFactor-6.0.0-cp312-cp312-win_amd64.whl (152.1 kB view details)

Uploaded CPython 3.12Windows x86-64

FindAFactor-6.0.0-cp312-cp312-manylinux_2_39_x86_64.whl (142.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.35+ x86-64

FindAFactor-6.0.0-cp38-cp38-manylinux_2_31_x86_64.whl (138.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ x86-64

File details

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

File metadata

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

File hashes

Hashes for findafactor-6.0.0.tar.gz
Algorithm Hash digest
SHA256 0aa90fa858ea4bec132d6a7b7a5a22554a10ca13e557f4437885038182fcdfb1
MD5 3c24f85993d50580945ef67a9dbf747b
BLAKE2b-256 b92a7326335add5dca15636b30a91b22692b1cb2ab30a77b401293943007b7aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.0.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 61ae2df7e2bcb1be9b2309a7884e8f7e2d2c94d2c3a18b013cbd97f120928c5b
MD5 d099f171d736c70afdb8cebcda10c290
BLAKE2b-256 2c393bd927edf860b9f5246b1d0d54ad1cf7d5b07688bad2bbf2d1d3d482d07a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.0.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 918cfcec24c9b1bbcf70f273388651f0ee5daeb7c41e75afc47ee3e63a89d544
MD5 1055efd5c8c22208fcda8bd0cadb06dc
BLAKE2b-256 2c474e4e7842c95f972e5a7391aaa40b12cf0b5c38cb9a7be2df66f01a418553

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.0.0-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 59a6948597edf98b5b67e7f1c0d6556fcc2efb6ea3f6c2300bf8d9593d1e2241
MD5 84955ceb687d534b74269019c521f4c5
BLAKE2b-256 81f73ae241205fec29d3da5d25e32e1646f5e1d2cc7471c9c4d72d4ecd9c79a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a68265d012b77a9c0eb8688726ac3c83665b7a4abd389a7dd8e3f6b729572bbb
MD5 5df88092eb0b27ed30724e865f251072
BLAKE2b-256 924d75bda16a10ee28d1e7e4f74d2f63464b71aa6958a1c113b6f15b5ccc4d0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.0.0-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 59bed0067dd800c85a8ba548d5b9dbf89fedaeba32eaebde5cb2c358ad246c81
MD5 1c2623146e12819b3ad9da90eb7074d0
BLAKE2b-256 189a3dba96252836ecf981c1ece0440266e9a161bb3689147f8f8c92eecbb7f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.0.0-cp310-cp310-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 3e8748c0eee4ee5a54b76a66d0ae362fc89357fc435217059ac7ad1b3f647a1e
MD5 3c20f35a12b369faa57b27bf249c741d
BLAKE2b-256 5e5edf026ad51a35d4a0c7ae1478ff50429da89fa64fc37a1bf82b3a1bf8f6de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-6.0.0-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 39f2a505d597111fbbf32d384cb4a183f7b6ef354ed06ae4ea1dfb9db92bbf84
MD5 9862e263a718a82f8251e24aa7f597ca
BLAKE2b-256 ad0c50984c0614b0c5117834d62cc831c068cf605b3c9eaf70a7855302f1bba7

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