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 "peturb" FACTOR_FINDER mode into non-multiples on the wheel, if the level is set above 1 (which might not actually work, but we leave it for your experimentation).
  • 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.1.0.tar.gz (5.7 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.1.0-cp313-cp313-macosx_15_0_arm64.whl (118.0 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

FindAFactor-5.1.0-cp313-cp313-macosx_14_0_arm64.whl (117.5 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

FindAFactor-5.1.0-cp313-cp313-macosx_13_0_x86_64.whl (132.7 kB view details)

Uploaded CPython 3.13macOS 13.0+ x86-64

FindAFactor-5.1.0-cp312-cp312-win_amd64.whl (152.9 kB view details)

Uploaded CPython 3.12Windows x86-64

FindAFactor-5.1.0-cp312-cp312-manylinux_2_39_x86_64.whl (142.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

FindAFactor-5.1.0-cp310-cp310-manylinux_2_35_x86_64.whl (145.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.35+ x86-64

FindAFactor-5.1.0-cp38-cp38-manylinux_2_31_x86_64.whl (138.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ x86-64

File details

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

File metadata

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

File hashes

Hashes for findafactor-5.1.0.tar.gz
Algorithm Hash digest
SHA256 94c6d81d8c529f3f936e72a109648bbf85eadaed3b784e9cd1fbec79fc9940fc
MD5 7c2aa13fd71e0328b0ba06cecca694b6
BLAKE2b-256 888019127dbe11df746d66f1a9fdf8e3d2e4dffb0d8179301185860e31c09cf3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-5.1.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 2149be3f54fc9d7b8e9912cc2d502c9741d9f72e69cfa218bb3c69ed5fe132b8
MD5 bfb64047376d05df982c3c03551b29c8
BLAKE2b-256 bc87e34c98c09ed885f014207d17d3c4613be37b0a7195d3a62f15e85b847753

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-5.1.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6d20b8a94c0e938e9a3251df310cc9a7da806e7bbf47253ea4e14dfb1c628e6c
MD5 e526e69e08e0acdbf1628c885b78fa3f
BLAKE2b-256 ba044ff62f0e7aee5bc4af3f2154112a66088068774fc96bfd4d0690feefaffa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-5.1.0-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 21ab96c233e6ec85b56f00261193462ed44041401e6b69ac659a764717f012c1
MD5 367e0fd092d541195351de7efeb9aa33
BLAKE2b-256 d39bdb41122e56d077bf77630915618d515c7921d715c15b2a47f9889e5f7eff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-5.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 27b1e44f0f7ab468cc8a746a561f0680ba95742d911c90ef3f27f54d8df74aec
MD5 89862b43173919120429438ce1d59548
BLAKE2b-256 84a34db101f8cbdfcde2e0009427def139302e0fb544be8a19e26d95a35e0ab9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-5.1.0-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 170e5da3322cc313d9e14b4c6339c7d16f59116d596457f77dee99283afd2d50
MD5 7b899e293320a400ed755caf8b30feef
BLAKE2b-256 b7044f4c8dad587d2dd7014da1553770aa01ad93f877dd3eeea3b6bd0e5cadd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-5.1.0-cp310-cp310-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 52af356110ede2280acab3b943d0bc62d9916c4c27d382af858c38c0ee639f9a
MD5 4ee195a733c37db0106853fe7b6d7797
BLAKE2b-256 580337ac3c046c2e288c92bb749693cb9d91d79a3af0604a95d1f948ef8495ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for FindAFactor-5.1.0-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 cc284871476586b540395b9ecbc84f029eaa93554ccfce5be394de7cddd3d76a
MD5 791f0ab09ec0a5fe410b809aab563b35
BLAKE2b-256 791a9278e9ead2a14635e8b01adade1bc58346108a71aa7121a079a54e4a97c2

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