Skip to content

Unify O(sqrt(N)) is_prime functions under project_euler #6258

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions project_euler/problem_003/sol1.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
import math


def is_prime(num: int) -> bool:
"""
Returns boolean representing primality of given number num.
def is_prime(number: int) -> bool:
"""Checks to see if a number is a prime in O(sqrt(n)).
A number is prime if it has exactly two factors: 1 and itself.
Returns boolean representing primality of given number num (i.e., if the
result is true, then the number is indeed prime else it is not).

>>> is_prime(2)
True
Expand All @@ -26,23 +28,21 @@ def is_prime(num: int) -> bool:
>>> is_prime(2999)
True
>>> is_prime(0)
Traceback (most recent call last):
...
ValueError: Parameter num must be greater than or equal to two.
False
>>> is_prime(1)
Traceback (most recent call last):
...
ValueError: Parameter num must be greater than or equal to two.
False
"""

if num <= 1:
raise ValueError("Parameter num must be greater than or equal to two.")
if num == 2:
if 1 < number < 4:
# 2 and 3 are primes
return True
elif num % 2 == 0:
elif number < 2 or number % 2 == 0 or number % 3 == 0:
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
return False
for i in range(3, int(math.sqrt(num)) + 1, 2):
if num % i == 0:

# All primes number are in format of 6k +/- 1
for i in range(5, int(math.sqrt(number) + 1), 6):
if number % i == 0 or number % (i + 2) == 0:
return False
return True

Expand Down
32 changes: 20 additions & 12 deletions project_euler/problem_007/sol1.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,37 @@
from math import sqrt


def is_prime(num: int) -> bool:
"""
Determines whether the given number is prime or not
def is_prime(number: int) -> bool:
"""Checks to see if a number is a prime in O(sqrt(n)).
A number is prime if it has exactly two factors: 1 and itself.
Returns boolean representing primality of given number num (i.e., if the
result is true, then the number is indeed prime else it is not).

>>> is_prime(2)
True
>>> is_prime(15)
>>> is_prime(3)
True
>>> is_prime(27)
False
>>> is_prime(29)
>>> is_prime(2999)
True
>>> is_prime(0)
False
>>> is_prime(1)
False
"""

if num == 2:
if 1 < number < 4:
# 2 and 3 are primes
return True
elif num % 2 == 0:
elif number < 2 or number % 2 == 0 or number % 3 == 0:
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
return False
else:
sq = int(sqrt(num)) + 1
for i in range(3, sq, 2):
if num % i == 0:
return False

# All primes number are in format of 6k +/- 1
for i in range(5, int(sqrt(number) + 1), 6):
if number % i == 0 or number % (i + 2) == 0:
return False
return True


Expand Down
29 changes: 23 additions & 6 deletions project_euler/problem_007/sol2.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,39 @@
References:
- https://en.wikipedia.org/wiki/Prime_number
"""
import math


def is_prime(number: int) -> bool:
"""
Determines whether the given number is prime or not
"""Checks to see if a number is a prime in O(sqrt(n)).
A number is prime if it has exactly two factors: 1 and itself.
Returns boolean representing primality of given number num (i.e., if the
result is true, then the number is indeed prime else it is not).

>>> is_prime(2)
True
>>> is_prime(15)
>>> is_prime(3)
True
>>> is_prime(27)
False
>>> is_prime(29)
>>> is_prime(2999)
True
>>> is_prime(0)
False
>>> is_prime(1)
False
"""

for i in range(2, int(number**0.5) + 1):
if number % i == 0:
if 1 < number < 4:
# 2 and 3 are primes
return True
elif number < 2 or number % 2 == 0 or number % 3 == 0:
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
return False

# All primes number are in format of 6k +/- 1
for i in range(5, int(math.sqrt(number) + 1), 6):
if number % i == 0 or number % (i + 2) == 0:
return False
return True

Expand Down
29 changes: 23 additions & 6 deletions project_euler/problem_007/sol3.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,37 @@


def is_prime(number: int) -> bool:
"""
Determines whether a given number is prime or not
"""Checks to see if a number is a prime in O(sqrt(n)).
A number is prime if it has exactly two factors: 1 and itself.
Returns boolean representing primality of given number num (i.e., if the
result is true, then the number is indeed prime else it is not).

>>> is_prime(2)
True
>>> is_prime(15)
>>> is_prime(3)
True
>>> is_prime(27)
False
>>> is_prime(29)
>>> is_prime(2999)
True
>>> is_prime(0)
False
>>> is_prime(1)
False
"""

if number % 2 == 0 and number > 2:
if 1 < number < 4:
# 2 and 3 are primes
return True
elif number < 2 or number % 2 == 0 or number % 3 == 0:
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
return False
return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2))

# All primes number are in format of 6k +/- 1
for i in range(5, int(math.sqrt(number) + 1), 6):
if number % i == 0 or number % (i + 2) == 0:
return False
return True


def prime_generator():
Expand Down
27 changes: 20 additions & 7 deletions project_euler/problem_010/sol1.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@
- https://en.wikipedia.org/wiki/Prime_number
"""

from math import sqrt
import math


def is_prime(n: int) -> bool:
"""
Returns boolean representing primality of given number num.
def is_prime(number: int) -> bool:
"""Checks to see if a number is a prime in O(sqrt(n)).
A number is prime if it has exactly two factors: 1 and itself.
Returns boolean representing primality of given number num (i.e., if the
result is true, then the number is indeed prime else it is not).

>>> is_prime(2)
True
Expand All @@ -26,13 +28,24 @@ def is_prime(n: int) -> bool:
False
>>> is_prime(2999)
True
>>> is_prime(0)
False
>>> is_prime(1)
False
"""

if 1 < n < 4:
if 1 < number < 4:
# 2 and 3 are primes
return True
elif n < 2 or not n % 2:
elif number < 2 or number % 2 == 0 or number % 3 == 0:
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
return False
return not any(not n % i for i in range(3, int(sqrt(n) + 1), 2))

# All primes number are in format of 6k +/- 1
for i in range(5, int(math.sqrt(number) + 1), 6):
if number % i == 0 or number % (i + 2) == 0:
return False
return True


def solution(n: int = 2000000) -> int:
Expand Down
23 changes: 19 additions & 4 deletions project_euler/problem_010/sol2.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@


def is_prime(number: int) -> bool:
"""
Returns boolean representing primality of given number num.
"""Checks to see if a number is a prime in O(sqrt(n)).
A number is prime if it has exactly two factors: 1 and itself.
Returns boolean representing primality of given number num (i.e., if the
result is true, then the number is indeed prime else it is not).

>>> is_prime(2)
True
Expand All @@ -27,11 +29,24 @@ def is_prime(number: int) -> bool:
False
>>> is_prime(2999)
True
>>> is_prime(0)
False
>>> is_prime(1)
False
"""

if number % 2 == 0 and number > 2:
if 1 < number < 4:
# 2 and 3 are primes
return True
elif number < 2 or number % 2 == 0 or number % 3 == 0:
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
return False
return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2))

# All primes number are in format of 6k +/- 1
for i in range(5, int(math.sqrt(number) + 1), 6):
if number % i == 0 or number % (i + 2) == 0:
return False
return True


def prime_generator() -> Iterator[int]:
Expand Down
41 changes: 29 additions & 12 deletions project_euler/problem_027/sol1.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,39 @@
import math


def is_prime(k: int) -> bool:
"""
Determine if a number is prime
>>> is_prime(10)
def is_prime(number: int) -> bool:
"""Checks to see if a number is a prime in O(sqrt(n)).
A number is prime if it has exactly two factors: 1 and itself.
Returns boolean representing primality of given number num (i.e., if the
result is true, then the number is indeed prime else it is not).

>>> is_prime(2)
True
>>> is_prime(3)
True
>>> is_prime(27)
False
>>> is_prime(11)
>>> is_prime(2999)
True
>>> is_prime(0)
False
>>> is_prime(1)
False
>>> is_prime(-10)
False
"""
if k < 2 or k % 2 == 0:
return False
elif k == 2:

if 1 < number < 4:
# 2 and 3 are primes
return True
else:
for x in range(3, int(math.sqrt(k) + 1), 2):
if k % x == 0:
return False
elif number < 2 or number % 2 == 0 or number % 3 == 0:
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
return False

# All primes number are in format of 6k +/- 1
for i in range(5, int(math.sqrt(number) + 1), 6):
if number % i == 0 or number % (i + 2) == 0:
return False
return True


Expand Down
51 changes: 36 additions & 15 deletions project_euler/problem_037/sol1.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
"""
Truncatable primes
Problem 37: https://projecteuler.net/problem=37

The number 3797 has an interesting property. Being prime itself, it is possible
to continuously remove digits from left to right, and remain prime at each stage:
3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3.
Expand All @@ -11,28 +14,46 @@

from __future__ import annotations

seive = [True] * 1000001
seive[1] = False
i = 2
while i * i <= 1000000:
if seive[i]:
for j in range(i * i, 1000001, i):
seive[j] = False
i += 1
import math


def is_prime(n: int) -> bool:
"""
Returns True if n is prime,
False otherwise, for 1 <= n <= 1000000
>>> is_prime(87)
def is_prime(number: int) -> bool:
"""Checks to see if a number is a prime in O(sqrt(n)).

A number is prime if it has exactly two factors: 1 and itself.

>>> is_prime(0)
False
>>> is_prime(1)
False
>>> is_prime(25363)
>>> is_prime(2)
True
>>> is_prime(3)
True
>>> is_prime(27)
False
>>> is_prime(87)
False
>>> is_prime(563)
True
>>> is_prime(2999)
True
>>> is_prime(67483)
False
"""
return seive[n]

if 1 < number < 4:
# 2 and 3 are primes
return True
elif number < 2 or number % 2 == 0 or number % 3 == 0:
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
return False

# All primes number are in format of 6k +/- 1
for i in range(5, int(math.sqrt(number) + 1), 6):
if number % i == 0 or number % (i + 2) == 0:
return False
return True


def list_truncated_nums(n: int) -> list[int]:
Expand Down
Loading