added prime exercise

This commit is contained in:
nvrl committed 2024-01-30 01:24:35 +01:00
1 parent 39e3c38a94
commit f50177f0cd
10 files changed
+242 -166

No files matched your search

+31
View File
@@ -0,0 +1,31 @@
# [Primzahlen](./primes.py)
## `is_prime`
Eine Primzahl ist eine Zahl die nur durch sich selbst und eins teilbar ist. Implementieren Sie die Funktion `is_prime(n: int) -> bool` welche
- `True` wenn `n` größer als 1 ist und eine Primzahl
- sonst `False`
## `next_prime`
Nun schreiben wir eine Funktion `next_prime` die eine Zahl `n` nimmt und uns die nächst größere Primzahl zurückgibt.
- Sie können diese sowohl iterativ also auch rekursiv lösen
- Es müssen keine weiteren Randbedingungen beachtet werden
## `prime_factorize`
Eine beliebiges aber festes $n \in \mathbb{N}_2$ kann entweder eine Primzahl sein oder eine Zahl welche man in ein Produkt aus Primzahlen zerlegen kann. Dieses Verfahren nennt man Primfaktorzerlegen.
Als kleines Beispiel kann man $20$ als Produkt $2 \cdot 2 \cdot 5$ darstellen. Dieses ist vor allem eindeutig und man kann für jeder Zahl ein solches Produkt finden.
Schreiben Sie nun folgende Funktion `prime_factorize(n: int) -> list[int]` welche
- für Zahlen `n < 2` eine leere Liste zurückgibt (`[]`)
- für Zahlen `n` die Prim sind einfach eine Liste mit der Zahl `n` zurückgibt (`[n]`)
- sonst für alle weiteren eine Liste mit den Primfaktoren zurückgibt (`[p1, p2, p3, ...]` mit `p1 * p2 * p3 * ... = n`)
Tipp: Sie können hierfür die Funktionen `is_prime` und `next_prime` verwenden
## [Hier gehts zu den Lösungen](./solution/primes.py)
+12
View File
@@ -0,0 +1,12 @@
def is_prime(n: int) -> bool:
# TODO: implement
return False
def next_prime(n: int) -> int:
return -1
def prime_factorize(n: int) -> list[int]:
# TODO: implement
return []
+107
View File
@@ -0,0 +1,107 @@
# Solution
## `is_prime`
Zunächst überprüfen wir alle Randbedingungen für `n < 2`
```python
if n < 2:
return False
```
wir wissen laut definition dass hier die Funktion zu `False` evaluieren soll.
Jetzt wollen wir durch alle Zahlen bis zu unserer Zahl `n` iterieren und schauen ob sich `n` noch anders teilen lässt
```python
for num in range(2, n):
if n % num == 0:
return False
```
Wenn `n` durch `num` teilbar ist können wir `False` zurückgeben, da `n` nicht nur durch sich selbst teilbar ist.
Jetzt geben wir noch `True` zurück wenn wir durch die For-Schleife iteriert sind und haben die Funktion.
```python
def is_prime(n: int) -> bool:
if n < 2:
return False
for num in range(2, n):
if n % num == 0:
return False
return True
```
Anmerkung: Wir müssen eigentlich nur alle Zahlen von $2$ bis $\lfloor n / 2 \rfloor$ so wie in der [Musterlösung](./primes.py). Warum?
<details>
<summary>Begründung:</summary>
Naja alle Zahlen größer als die Hälfte unserer zu testenen Zahl n sind keine Ganzzahligen Teiler außer unsere Zahl n selber. Betrachten wir 7, warum müssen wir nur bis 3 testen?
- 7 / 2 > 2
- 7 / 3 > 2
- 7 / 4 < 2
- ...
- 7 / 7 = 1
</details>
## `next_prime`
Wir inkrementieren solange `n` bis `is_prime` erfüllt ist und geben diesen Wert dann zurück.
Iterativ:
- wir speichern uns `n` zwischen und inkrementieren initial
- nun testen wir in einer `While`-Schleife `num` bis diese eine Primzahl ist und geben sie zurück
```python
num += 1
while not is_prime(num):
num += 1
return num
```
Rekursiv:
- Unsere Abbruchbedingung ist, dass `n + 1` eine Primzahl ist
- Ansonsten müssen wir rekursiv `n` inkrementieren bis wir eine Zahl erreichen die Prim ist
```python
if is_prime(n + 1):
return n + 1
else:
return next_prime(n + 1)
```
## `prime_factorize`
Zunächst definieren wir alle Variabeln die wir brauchen
```python
prime_factors: list[int] = [] # unsere Primfaktoren
num = n # damit wir n nicht verändern
prime = 2 # erste Primzahl
```
Nun müssen wir eigentlich nur noch solange `num` durch Primzahlen teilen bis `num == 1` ist.
Wichtig hierbei ist dass eine Primzahl mehrfach vorkommen kann, also müssen wir immer wieder bei `2` anfangen.
```python
while num > 1:
if num % prime == 0: # wir haben eine primzahl gefunden
prime_factors.append(prime)
num //= prime
prime = 2 # wichtig prime auf 2 zu setzen
# weil wir von vorne suchen müssen
else: # wenn wir keine passende Primzahl gefunden haben
prime = next_prime(prime) # dann springen wir zur nächsten
```
Und dann geben wir nur noch die liste `prime_factors` zurück. Diese ist
- für ungültige Eingaben `n <= 1` leer, da die Schleifenbedingung nie erfüllt ist.
- für Primzahlen `n` genau `[n]`, da Primzahlen nur durch sich selbst Teilbar sind
- oder alle Primfaktoren die also Produkt `n` ergeben
+36
View File
@@ -0,0 +1,36 @@
def is_prime(n: int) -> bool:
if n < 2:
return False
for i in range(2, n // 2 + 1):
if n % i == 0:
return False
return True
def next_prime(n: int) -> int:
return n + 1 if is_prime(n + 1) else next_prime(n + 1)
def next_prime_iterative(n: int) -> int:
num = n + 1
while not is_prime(num):
num += 1
return num
def prime_factorize(n: int) -> list[int]:
prime_factors: list[int] = []
num = n
prime = 2
while num > 1:
if num % prime == 0:
prime_factors.append(prime)
num //= prime
prime = 2
else:
prime = next_prime(prime)
return prime_factors
if __name__ == "__main__":
prime_factorize(10)
+60
View File
@@ -0,0 +1,60 @@
from primes import is_prime, prime_factorize, next_prime
from typing import Iterable
PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
947, 953, 967, 971, 977, 983, 991, 997]
PRIME_FACTORS = {2: [2], 3: [3], 4: [2, 2], 5: [5], 6: [2, 3], 7: [7], 8: [2, 2, 2], 9: [3, 3], 10: [2, 5], 11: [11], 12: [2, 2, 3], 13: [13], 14: [2, 7], 15: [3, 5], 16: [2, 2, 2, 2], 17: [17], 18: [2, 3, 3], 19: [19], 20: [2, 2, 5], 21: [3, 7], 22: [2, 11], 23: [23], 24: [2, 2, 2, 3], 25: [5, 5], 26: [2, 13], 27: [3, 3, 3], 28: [2, 2, 7], 29: [29], 30: [2, 3, 5], 31: [31], 32: [2, 2, 2, 2, 2], 33: [3, 11], 34: [2, 17], 35: [5, 7], 36: [2, 2, 3, 3], 37: [37], 38: [2, 19], 39: [3, 13], 40: [2, 2, 2, 5], 41: [41], 42: [2, 3, 7], 43: [43], 44: [2, 2, 11], 45: [3, 3, 5], 46: [2, 23], 47: [47], 48: [2, 2, 2, 2, 3], 49: [7, 7], 50: [2, 5, 5], 51: [3, 17], 52: [2, 2, 13], 53: [53], 54: [2, 3, 3, 3], 55: [5, 11], 56: [2, 2, 2, 7], 57: [3, 19], 58: [2, 29], 59: [59], 60: [2, 2, 3, 5], 61: [61], 62: [2, 31], 63: [3, 3, 7], 64: [2, 2, 2, 2, 2, 2], 65: [5, 13], 66: [2, 3, 11], 67: [67], 68: [2, 2, 17], 69: [3, 23], 70: [2, 5, 7], 71: [71], 72: [2, 2, 2, 3, 3], 73: [73], 74: [2, 37], 75: [3, 5, 5], 76: [2, 2, 19], 77: [7, 11], 78: [2, 3, 13], 79: [79], 80: [2, 2, 2, 2, 5], 81: [3, 3, 3, 3], 82: [2, 41], 83: [83], 84: [2, 2, 3, 7], 85: [5, 17], 86: [2, 43], 87: [3, 29], 88: [2, 2, 2, 11], 89: [89], 90: [2, 3, 3, 5], 91: [7, 13], 92: [2, 2, 23], 93: [3, 31], 94: [2, 47], 95: [5, 19], 96: [2, 2, 2, 2, 2, 3], 97: [97], 98: [2, 7, 7], 99: [3, 3, 11], 100: [2, 2, 5, 5], 101: [101], 102: [2, 3, 17], 103: [103], 104: [2, 2, 2, 13], 105: [3, 5, 7], 106: [2, 53], 107: [107], 108: [2, 2, 3, 3, 3], 109: [109], 110: [2, 5, 11], 111: [3, 37], 112: [2, 2, 2, 2, 7], 113: [113], 114: [2, 3, 19], 115: [5, 23], 116: [2, 2, 29], 117: [3, 3, 13], 118: [2, 59], 119: [7, 17], 120: [2, 2, 2, 3, 5], 121: [11, 11], 122: [2, 61], 123: [3, 41], 124: [2, 2, 31], 125: [5, 5, 5], 126: [2, 3, 3, 7], 127: [127], 128: [2, 2, 2, 2, 2, 2, 2], 129: [3, 43], 130: [2, 5, 13], 131: [131], 132: [2, 2, 3, 11], 133: [7, 19], 134: [2, 67], 135: [3, 3, 3, 5], 136: [2, 2, 2, 17], 137: [137], 138: [2, 3, 23], 139: [139], 140: [2, 2, 5, 7], 141: [3, 47], 142: [2, 71], 143: [11, 13], 144: [2, 2, 2, 2, 3, 3], 145: [5, 29], 146: [2, 73], 147: [3, 7, 7], 148: [2, 2, 37], 149: [149], 150: [2, 3, 5, 5], 151: [151], 152: [2, 2, 2, 19], 153: [3, 3, 17], 154: [2, 7, 11], 155: [5, 31], 156: [2, 2, 3, 13], 157: [157], 158: [2, 79], 159: [3, 53], 160: [2, 2, 2, 2, 2, 5], 161: [7, 23], 162: [2, 3, 3, 3, 3], 163: [163], 164: [2, 2, 41], 165: [3, 5, 11], 166: [2, 83], 167: [167], 168: [2, 2, 2, 3, 7], 169: [13, 13], 170: [2, 5, 17], 171: [3, 3, 19], 172: [2, 2, 43], 173: [173], 174: [2, 3, 29], 175: [5, 5, 7], 176: [2, 2, 2, 2, 11], 177: [3, 59], 178: [2, 89], 179: [179], 180: [2, 2, 3, 3, 5], 181: [181], 182: [2, 7, 13], 183: [3, 61], 184: [2, 2, 2, 23], 185: [5, 37], 186: [2, 3, 31], 187: [11, 17], 188: [2, 2, 47], 189: [3, 3, 3, 7], 190: [2, 5, 19], 191: [191], 192: [2, 2, 2, 2, 2, 2, 3], 193: [193], 194: [2, 97], 195: [3, 5, 13], 196: [2, 2, 7, 7], 197: [197], 198: [2, 3, 3, 11], 199: [199], 200: [2, 2, 2, 5, 5], 201: [3, 67], 202: [2, 101], 203: [7, 29], 204: [2, 2, 3, 17], 205: [5, 41], 206: [2, 103], 207: [3, 3, 23], 208: [2, 2, 2, 2, 13], 209: [11, 19], 210: [2, 3, 5, 7], 211: [211], 212: [2, 2, 53], 213: [3, 71], 214: [2, 107], 215: [5, 43], 216: [2, 2, 2, 3, 3, 3], 217: [7, 31], 218: [2, 109], 219: [3, 73], 220: [2, 2, 5, 11], 221: [13, 17], 222: [2, 3, 37], 223: [223], 224: [2, 2, 2, 2, 2, 7], 225: [3, 3, 5, 5], 226: [2, 113], 227: [227], 228: [2, 2, 3, 19], 229: [229], 230: [2, 5, 23], 231: [3, 7, 11], 232: [2, 2, 2, 29], 233: [233], 234: [2, 3, 3, 13], 235: [5, 47], 236: [2, 2, 59], 237: [3, 79], 238: [2, 7, 17], 239: [239], 240: [2, 2, 2, 2, 3, 5], 241: [241], 242: [2, 11, 11], 243: [3, 3, 3, 3, 3], 244: [2, 2, 61], 245: [5, 7, 7], 246: [2, 3, 41], 247: [13, 19], 248: [2, 2, 2, 31], 249: [3, 83], 250: [2, 5, 5, 5], 251: [251], 252: [2, 2, 3, 3, 7], 253: [11, 23], 254: [2, 127], 255: [3, 5, 17], 256: [2, 2, 2, 2, 2, 2, 2, 2], 257: [257], 258: [2, 3, 43], 259: [7, 37], 260: [2, 2, 5, 13], 261: [3, 3, 29], 262: [2, 131], 263: [263], 264: [2, 2, 2, 3, 11], 265: [5, 53], 266: [2, 7, 19], 267: [3, 89], 268: [2, 2, 67], 269: [269], 270: [2, 3, 3, 3, 5], 271: [271], 272: [2, 2, 2, 2, 17], 273: [3, 7, 13], 274: [2, 137], 275: [5, 5, 11], 276: [2, 2, 3, 23], 277: [277], 278: [2, 139], 279: [3, 3, 31], 280: [2, 2, 2, 5, 7], 281: [281], 282: [2, 3, 47], 283: [283], 284: [2, 2, 71], 285: [3, 5, 19], 286: [2, 11, 13], 287: [7, 41], 288: [2, 2, 2, 2, 2, 3, 3], 289: [17, 17], 290: [2, 5, 29], 291: [3, 97], 292: [2, 2, 73], 293: [293], 294: [2, 3, 7, 7], 295: [5, 59], 296: [2, 2, 2, 37], 297: [3, 3, 3, 11], 298: [2, 149], 299: [13, 23], 300: [2, 2, 3, 5, 5], 301: [7, 43], 302: [2, 151], 303: [3, 101], 304: [2, 2, 2, 2, 19], 305: [5, 61], 306: [2, 3, 3, 17], 307: [307], 308: [2, 2, 7, 11], 309: [3, 103], 310: [2, 5, 31], 311: [311], 312: [2, 2, 2, 3, 13], 313: [313], 314: [2, 157], 315: [3, 3, 5, 7], 316: [2, 2, 79], 317: [317], 318: [2, 3, 53], 319: [11, 29], 320: [2, 2, 2, 2, 2, 2,Line truncated
def test_is_prime():
for prime in PRIMES:
assert is_prime(prime)
for not_prime in [n for n in range(4, 1000) if n not in PRIMES]:
assert not is_prime(not_prime)
def test_next_prime():
prime = next_prime(0)
assert prime == 2
for num in range(2, 996):
prime = next_prime(num)
i = 0
while i < len(PRIMES) - 1 and num >= PRIMES[i + 1]:
i += 1
p1 = PRIMES[i]
p2 = PRIMES[i + 1]
assert p1 <= num < p2 and p2 == prime
def test_prime_factorize():
for prime in PRIMES:
assert prime_factorize(prime) == [prime]
prime_factors: Iterable[tuple[int, Iterable[int]]] = [
(n, prime_factorize(n)) for n in range(2, 1001)]
for n, factors in prime_factors:
for factor in factors:
assert factor in PRIMES
assert PRIME_FACTORS[n] == factors
assert prime_factorize(0) == []
assert prime_factorize(1) == []
assert prime_factorize(-2) == []
+60
View File
@@ -0,0 +1,60 @@
from primes import is_prime, prime_factorize, next_prime
from typing import Iterable
PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
947, 953, 967, 971, 977, 983, 991, 997]
PRIME_FACTORS = {2: [2], 3: [3], 4: [2, 2], 5: [5], 6: [2, 3], 7: [7], 8: [2, 2, 2], 9: [3, 3], 10: [2, 5], 11: [11], 12: [2, 2, 3], 13: [13], 14: [2, 7], 15: [3, 5], 16: [2, 2, 2, 2], 17: [17], 18: [2, 3, 3], 19: [19], 20: [2, 2, 5], 21: [3, 7], 22: [2, 11], 23: [23], 24: [2, 2, 2, 3], 25: [5, 5], 26: [2, 13], 27: [3, 3, 3], 28: [2, 2, 7], 29: [29], 30: [2, 3, 5], 31: [31], 32: [2, 2, 2, 2, 2], 33: [3, 11], 34: [2, 17], 35: [5, 7], 36: [2, 2, 3, 3], 37: [37], 38: [2, 19], 39: [3, 13], 40: [2, 2, 2, 5], 41: [41], 42: [2, 3, 7], 43: [43], 44: [2, 2, 11], 45: [3, 3, 5], 46: [2, 23], 47: [47], 48: [2, 2, 2, 2, 3], 49: [7, 7], 50: [2, 5, 5], 51: [3, 17], 52: [2, 2, 13], 53: [53], 54: [2, 3, 3, 3], 55: [5, 11], 56: [2, 2, 2, 7], 57: [3, 19], 58: [2, 29], 59: [59], 60: [2, 2, 3, 5], 61: [61], 62: [2, 31], 63: [3, 3, 7], 64: [2, 2, 2, 2, 2, 2], 65: [5, 13], 66: [2, 3, 11], 67: [67], 68: [2, 2, 17], 69: [3, 23], 70: [2, 5, 7], 71: [71], 72: [2, 2, 2, 3, 3], 73: [73], 74: [2, 37], 75: [3, 5, 5], 76: [2, 2, 19], 77: [7, 11], 78: [2, 3, 13], 79: [79], 80: [2, 2, 2, 2, 5], 81: [3, 3, 3, 3], 82: [2, 41], 83: [83], 84: [2, 2, 3, 7], 85: [5, 17], 86: [2, 43], 87: [3, 29], 88: [2, 2, 2, 11], 89: [89], 90: [2, 3, 3, 5], 91: [7, 13], 92: [2, 2, 23], 93: [3, 31], 94: [2, 47], 95: [5, 19], 96: [2, 2, 2, 2, 2, 3], 97: [97], 98: [2, 7, 7], 99: [3, 3, 11], 100: [2, 2, 5, 5], 101: [101], 102: [2, 3, 17], 103: [103], 104: [2, 2, 2, 13], 105: [3, 5, 7], 106: [2, 53], 107: [107], 108: [2, 2, 3, 3, 3], 109: [109], 110: [2, 5, 11], 111: [3, 37], 112: [2, 2, 2, 2, 7], 113: [113], 114: [2, 3, 19], 115: [5, 23], 116: [2, 2, 29], 117: [3, 3, 13], 118: [2, 59], 119: [7, 17], 120: [2, 2, 2, 3, 5], 121: [11, 11], 122: [2, 61], 123: [3, 41], 124: [2, 2, 31], 125: [5, 5, 5], 126: [2, 3, 3, 7], 127: [127], 128: [2, 2, 2, 2, 2, 2, 2], 129: [3, 43], 130: [2, 5, 13], 131: [131], 132: [2, 2, 3, 11], 133: [7, 19], 134: [2, 67], 135: [3, 3, 3, 5], 136: [2, 2, 2, 17], 137: [137], 138: [2, 3, 23], 139: [139], 140: [2, 2, 5, 7], 141: [3, 47], 142: [2, 71], 143: [11, 13], 144: [2, 2, 2, 2, 3, 3], 145: [5, 29], 146: [2, 73], 147: [3, 7, 7], 148: [2, 2, 37], 149: [149], 150: [2, 3, 5, 5], 151: [151], 152: [2, 2, 2, 19], 153: [3, 3, 17], 154: [2, 7, 11], 155: [5, 31], 156: [2, 2, 3, 13], 157: [157], 158: [2, 79], 159: [3, 53], 160: [2, 2, 2, 2, 2, 5], 161: [7, 23], 162: [2, 3, 3, 3, 3], 163: [163], 164: [2, 2, 41], 165: [3, 5, 11], 166: [2, 83], 167: [167], 168: [2, 2, 2, 3, 7], 169: [13, 13], 170: [2, 5, 17], 171: [3, 3, 19], 172: [2, 2, 43], 173: [173], 174: [2, 3, 29], 175: [5, 5, 7], 176: [2, 2, 2, 2, 11], 177: [3, 59], 178: [2, 89], 179: [179], 180: [2, 2, 3, 3, 5], 181: [181], 182: [2, 7, 13], 183: [3, 61], 184: [2, 2, 2, 23], 185: [5, 37], 186: [2, 3, 31], 187: [11, 17], 188: [2, 2, 47], 189: [3, 3, 3, 7], 190: [2, 5, 19], 191: [191], 192: [2, 2, 2, 2, 2, 2, 3], 193: [193], 194: [2, 97], 195: [3, 5, 13], 196: [2, 2, 7, 7], 197: [197], 198: [2, 3, 3, 11], 199: [199], 200: [2, 2, 2, 5, 5], 201: [3, 67], 202: [2, 101], 203: [7, 29], 204: [2, 2, 3, 17], 205: [5, 41], 206: [2, 103], 207: [3, 3, 23], 208: [2, 2, 2, 2, 13], 209: [11, 19], 210: [2, 3, 5, 7], 211: [211], 212: [2, 2, 53], 213: [3, 71], 214: [2, 107], 215: [5, 43], 216: [2, 2, 2, 3, 3, 3], 217: [7, 31], 218: [2, 109], 219: [3, 73], 220: [2, 2, 5, 11], 221: [13, 17], 222: [2, 3, 37], 223: [223], 224: [2, 2, 2, 2, 2, 7], 225: [3, 3, 5, 5], 226: [2, 113], 227: [227], 228: [2, 2, 3, 19], 229: [229], 230: [2, 5, 23], 231: [3, 7, 11], 232: [2, 2, 2, 29], 233: [233], 234: [2, 3, 3, 13], 235: [5, 47], 236: [2, 2, 59], 237: [3, 79], 238: [2, 7, 17], 239: [239], 240: [2, 2, 2, 2, 3, 5], 241: [241], 242: [2, 11, 11], 243: [3, 3, 3, 3, 3], 244: [2, 2, 61], 245: [5, 7, 7], 246: [2, 3, 41], 247: [13, 19], 248: [2, 2, 2, 31], 249: [3, 83], 250: [2, 5, 5, 5], 251: [251], 252: [2, 2, 3, 3, 7], 253: [11, 23], 254: [2, 127], 255: [3, 5, 17], 256: [2, 2, 2, 2, 2, 2, 2, 2], 257: [257], 258: [2, 3, 43], 259: [7, 37], 260: [2, 2, 5, 13], 261: [3, 3, 29], 262: [2, 131], 263: [263], 264: [2, 2, 2, 3, 11], 265: [5, 53], 266: [2, 7, 19], 267: [3, 89], 268: [2, 2, 67], 269: [269], 270: [2, 3, 3, 3, 5], 271: [271], 272: [2, 2, 2, 2, 17], 273: [3, 7, 13], 274: [2, 137], 275: [5, 5, 11], 276: [2, 2, 3, 23], 277: [277], 278: [2, 139], 279: [3, 3, 31], 280: [2, 2, 2, 5, 7], 281: [281], 282: [2, 3, 47], 283: [283], 284: [2, 2, 71], 285: [3, 5, 19], 286: [2, 11, 13], 287: [7, 41], 288: [2, 2, 2, 2, 2, 3, 3], 289: [17, 17], 290: [2, 5, 29], 291: [3, 97], 292: [2, 2, 73], 293: [293], 294: [2, 3, 7, 7], 295: [5, 59], 296: [2, 2, 2, 37], 297: [3, 3, 3, 11], 298: [2, 149], 299: [13, 23], 300: [2, 2, 3, 5, 5], 301: [7, 43], 302: [2, 151], 303: [3, 101], 304: [2, 2, 2, 2, 19], 305: [5, 61], 306: [2, 3, 3, 17], 307: [307], 308: [2, 2, 7, 11], 309: [3, 103], 310: [2, 5, 31], 311: [311], 312: [2, 2, 2, 3, 13], 313: [313], 314: [2, 157], 315: [3, 3, 5, 7], 316: [2, 2, 79], 317: [317], 318: [2, 3, 53], 319: [11, 29], 320: [2, 2, 2, 2, 2, 2,Line truncated
def test_is_prime():
for prime in PRIMES:
assert is_prime(prime)
for not_prime in [n for n in range(4, 1000) if n not in PRIMES]:
assert not is_prime(not_prime)
def test_next_prime():
prime = next_prime(0)
assert prime == 2
for num in range(2, 996):
prime = next_prime(num)
i = 0
while i < len(PRIMES) - 1 and num >= PRIMES[i + 1]:
i += 1
p1 = PRIMES[i]
p2 = PRIMES[i + 1]
assert p1 <= num < p2 and p2 == prime
def test_prime_factorize():
for prime in PRIMES:
assert prime_factorize(prime) == [prime]
prime_factors: Iterable[tuple[int, Iterable[int]]] = [
(n, prime_factorize(n)) for n in range(2, 1001)]
for n, factors in prime_factors:
for factor in factors:
assert factor in PRIMES
assert PRIME_FACTORS[n] == factors
assert prime_factorize(0) == []
assert prime_factorize(1) == []
assert prime_factorize(-2) == []