[+] A4 P2.4, 2.5

This commit is contained in:
Hykilpikonna
2021-11-09 12:51:59 -05:00
parent 206b54044f
commit 0210a1c8ba
+24
View File
@@ -83,6 +83,30 @@ def coprime_to_all(primes: set[int], n: int) -> list[int]:
and may NOT modify it (even though it is not as efficient as it could be!!).
- You will find the math.prod function useful.
"""
increment = math.prod(primes)
nums_so_far = starting_coprime_numbers(primes)
period = len(nums_so_far)
while nums_so_far[-period] + increment < n:
# Note: Write four assert statements here expressing the four loop invariants from the
# assignment handout. These statements should be at the top of the loop body.
# Loop Invariant 1: every number k in nums_so_far is coprime to every prime
assert all(all(math.gcd(p, k) == 1 for p in primes) for k in nums_so_far)
# Loop Invariant 2: for all natural numbers i between 0 and len(nums_so_far) - period - 1 inclusive,
# nums_so_far[i] + increment == nums_so_far[i + period].
assert all(nums_so_far[i] + increment == nums_so_far[i + period] for i in range(len(nums_so_far) - period))
# Loop Invariant 3: for all natural numbers i between 0 and len(nums_so_far) - 2 inclusive,
# nums_so_far[i] < nums_so_far[i + 1] (this means that nums_so_far is always sorted).
assert all(nums_so_far[i] < nums_so_far[i + 1] for i in range(len(nums_so_far) - 2 + 1))
# Loop Invariant 4: for all natural numbers k between 0 and nums_so_far[-1] inclusive,
# if k is coprime to all primes, then k in nums_so_far.
assert all(k in nums_so_far for k in range(nums_so_far[-1] + 1)
if all(math.gcd(p, k) == 1 for p in primes))
next_number = nums_so_far[-period] + increment
list.append(nums_so_far, next_number)
return nums_so_far
def starting_coprime_numbers(primes: set[int]) -> list[int]: