mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
4d0c830d2c
* ci(pre-commit): Add ``flake8-builtins`` additional dependency to ``pre-commit`` (#7104) * refactor: Fix ``flake8-builtins`` (#7104) * fix(lru_cache): Fix naming conventions in docstrings (#7104) * ci(pre-commit): Order additional dependencies alphabetically (#7104) * fix(lfu_cache): Correct function name in docstring (#7104) * Update strings/snake_case_to_camel_pascal_case.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update data_structures/stacks/next_greater_element.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update digital_image_processing/index_calculation.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update graphs/prim.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update hashes/djb2.py Co-authored-by: Christian Clauss <cclauss@me.com> * refactor: Rename `_builtin` to `builtin_` ( #7104) * fix: Rename all instances (#7104) * refactor: Update variable names (#7104) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * ci: Create ``tox.ini`` and ignore ``A003`` (#7123) * revert: Remove function name changes (#7104) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Rename tox.ini to .flake8 * Update data_structures/heap/heap.py Co-authored-by: Dhruv Manilawala <dhruvmanila@gmail.com> * refactor: Rename `next_` to `next_item` (#7104) * ci(pre-commit): Add `flake8` plugin `flake8-bugbear` (#7127) * refactor: Follow `flake8-bugbear` plugin (#7127) * fix: Correct `knapsack` code (#7127) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: Christian Clauss <cclauss@me.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Dhruv Manilawala <dhruvmanila@gmail.com>
52 lines
1.3 KiB
Python
52 lines
1.3 KiB
Python
import random
|
|
|
|
from .binary_exp_mod import bin_exp_mod
|
|
|
|
|
|
# This is a probabilistic check to test primality, useful for big numbers!
|
|
# if it's a prime, it will return true
|
|
# if it's not a prime, the chance of it returning true is at most 1/4**prec
|
|
def is_prime_big(n, prec=1000):
|
|
"""
|
|
>>> from maths.prime_check import is_prime
|
|
>>> # all(is_prime_big(i) == is_prime(i) for i in range(1000)) # 3.45s
|
|
>>> all(is_prime_big(i) == is_prime(i) for i in range(256))
|
|
True
|
|
"""
|
|
if n < 2:
|
|
return False
|
|
|
|
if n % 2 == 0:
|
|
return n == 2
|
|
|
|
# this means n is odd
|
|
d = n - 1
|
|
exp = 0
|
|
while d % 2 == 0:
|
|
d /= 2
|
|
exp += 1
|
|
|
|
# n - 1=d*(2**exp)
|
|
count = 0
|
|
while count < prec:
|
|
a = random.randint(2, n - 1)
|
|
b = bin_exp_mod(a, d, n)
|
|
if b != 1:
|
|
flag = True
|
|
for _ in range(exp):
|
|
if b == n - 1:
|
|
flag = False
|
|
break
|
|
b = b * b
|
|
b %= n
|
|
if flag:
|
|
return False
|
|
count += 1
|
|
return True
|
|
|
|
|
|
if __name__ == "__main__":
|
|
n = abs(int(input("Enter bound : ").strip()))
|
|
print("Here's the list of primes:")
|
|
print(", ".join(str(i) for i in range(n + 1) if is_prime_big(i)))
|