diff --git a/generator/primes/README.md b/generator/primes/README.md new file mode 100644 index 0000000..74e0cd6 --- /dev/null +++ b/generator/primes/README.md @@ -0,0 +1 @@ +# primes generator diff --git a/generator/primes/primes.py b/generator/primes/primes.py new file mode 100644 index 0000000..e69de29 diff --git a/generator/primes/solution/primes.py b/generator/primes/solution/primes.py new file mode 100644 index 0000000..379b2e3 --- /dev/null +++ b/generator/primes/solution/primes.py @@ -0,0 +1,29 @@ +from typing import Iterator + + +def is_prime(n: int) -> bool: + if n < 2: + return False + for d in range(2, n // 2 + 1): + if n % d == 0: + return False + return True + + +def primes() -> Iterator[int]: + num = 2 + while True: + if is_prime(num): + yield num + num += 1 + + +def prime_factorize(n: int) -> Iterator[int]: + it = primes() + num = n + while num > 1: + if num % (prime := next(it)) != 0: + continue + num //= prime + it = primes() + yield prime diff --git a/generator/primes/solution/test_primes.py b/generator/primes/solution/test_primes.py new file mode 100644 index 0000000..a5dbe0e --- /dev/null +++ b/generator/primes/solution/test_primes.py @@ -0,0 +1,51 @@ +from primes import is_prime, prime_factorize, primes +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, 5], 321: [3, 107], 322: [2, 7, 23], 323: [17, 19], 324: [2, 2, 3, 3, 3, 3], 325: [5, 5, 13], 326: [2, 163], 327: [3, 109], 328: [2, 2, 2, 41], 329: [7, 47], 330: [2, 3, 5, 11], 331: [331], 332: [2, 2, 83], 333: [3, 3, 37], 334: [2, 167], 335: [5, 67], 336: [2, 2, 2, 2, 3, 7], 337: [337], 338: [2, 13, 13], 339: [3, 113], 340: [2, 2, 5, 17], 341: [11, 31], 342: [2, 3, 3, 19], 343: [7, 7, 7], 344: [2, 2, 2, 43], 345: [3, 5, 23], 346: [2, 173], 347: [347], 348: [2, 2, 3, 29], 349: [349], 350: [2, 5, 5, 7], 351: [3, 3, 3, 13], 352: [2, 2, 2, 2, 2, 11], 353: [353], 354: [2, 3, 59], 355: [5, 71], 356: [2, 2, 89], 357: [3, 7, 17], 358: [2, 179], 359: [359], 360: [2, 2, 2, 3, 3, 5], 361: [19, 19], 362: [2, 181], 363: [3, 11, 11], 364: [2, 2, 7, 13], 365: [5, 73], 366: [2, 3, 61], 367: [367], 368: [2, 2, 2, 2, 23], 369: [3, 3, 41], 370: [2, 5, 37], 371: [7, 53], 372: [2, 2, 3, 31], 373: [373], 374: [2, 11, 17], 375: [3, 5, 5, 5], 376: [2, 2, 2, 47], 377: [13, 29], 378: [2, 3, 3, 3, 7], 379: [379], 380: [2, 2, 5, 19], 381: [3, 127], 382: [2, 191], 383: [383], 384: [2, 2, 2, 2, 2, 2, 2, 3], 385: [5, 7, 11], 386: [2, 193], 387: [3, 3, 43], 388: [2, 2, 97], 389: [389], 390: [2, 3, 5, 13], 391: [17, 23], 392: [2, 2, 2, 7, 7], 393: [3, 131], 394: [2, 197], 395: [5, 79], 396: [2, 2, 3, 3, 11], 397: [397], 398: [2, 199], 399: [3, 7, 19], 400: [2, 2, 2, 2, 5, 5], 401: [401], 402: [2, 3, 67], 403: [13, 31], 404: [2, 2, 101], 405: [3, 3, 3, 3, 5], 406: [2, 7, 29], 407: [11, 37], 408: [2, 2, 2, 3, 17], 409: [409], 410: [2, 5, 41], 411: [3, 137], 412: [2, 2, 103], 413: [7, 59], 414: [2, 3, 3, 23], 415: [5, 83], 416: [2, 2, 2, 2, 2, 13], 417: [3, 139], 418: [2, 11, 19], 419: [419], 420: [2, 2, 3, 5, 7], 421: [421], 422: [2, 211], 423: [3, 3, 47], 424: [2, 2, 2, 53], 425: [5, 5, 17], 426: [2, 3, 71], 427: [7, 61], 428: [2, 2, 107], 429: [3, 11, 13], 430: [2, 5, 43], 431: [431], 432: [2, 2, 2, 2, 3, 3, 3], 433: [433], 434: [2, 7, 31], 435: [3, 5, 29], 436: [2, 2, 109], 437: [19, 23], 438: [2, 3, 73], 439: [439], 440: [2, 2, 2, 5, 11], 441: [3, 3, 7, 7], 442: [2, 13, 17], 443: [443], 444: [2, 2, 3, 37], 445: [5, 89], 446: [2, 223], 447: [3, 149], 448: [2, 2, 2, 2, 2, 2, 7], 449: [449], 450: [2, 3, 3, 5, 5], 451: [11, 41], 452: [2, 2, 113], 453: [3, 151], 454: [2, 227], 455: [5, 7, 13], 456: [2, 2, 2, 3, 19], 457: [457], 458: [2, 229], 459: [3, 3, 3, 17], 460: [2, 2, 5, 23], 461: [461], 462: [2, 3, 7, 11], 463: [463], 464: [2, 2, 2, 2, 29], 465: [3, 5, 31], 466: [2, 233], 467: [467], 468: [2, 2, 3, 3, 13], 469: [7, 67], 470: [2, 5, 47], 471: [3, 157], 472: [2, 2, 2, 59], 473: [11, 43], 474: [2, 3, 79], 475: [5, 5, 19], 476: [2, 2, 7, 17], 477: [3, 3, 53], 478: [2, 239], 479: [479], 480: [2, 2, 2, 2, 2, 3, 5], 481: [13, 37], 482: [2, 241], 483: [3, 7, 23], 484: [2, 2, 11, 11], 485: [5, 97], 486: [2, 3, 3, 3, 3, 3], 487: [487], 488: [2, 2, 2, 61], 489: [3, 163], 490: [2, 5, 7, 7], 491: [491], 492: [2, 2, 3, 41], 493: [17, 29], 494: [2, 13, 19], 495: [3, 3, 5, 11], 496: [2, 2, 2, 2, 31], 497: [7, 71], 498: [2, 3, 83], 499: [499], 500: [2, 2, 5, 5, 5], 501: [3, 167], 502: [2, 251], 503: [503], 504: [2, 2, 2, 3, 3, 7], 505: [5, 101], 506: [2, 11, 23], 507: [3, 13, 13], 508: [2, 2, 127], 509: [509], 510: [2, 3, 5, 17], 511: [7, 73], 512: [2, 2, 2, 2, 2, 2, 2, 2, 2], 513: [3, 3, 3, 19], 514: [2, 257], 515: [5, 103], 516: [2, 2, 3, 43], 517: [11, 47], 518: [2, 7, 37], 519: [3, 173], 520: [ + 2, 2, 2, 5, 13], 521: [521], 522: [2, 3, 3, 29], 523: [523], 524: [2, 2, 131], 525: [3, 5, 5, 7], 526: [2, 263], 527: [17, 31], 528: [2, 2, 2, 2, 3, 11], 529: [23, 23], 530: [2, 5, 53], 531: [3, 3, 59], 532: [2, 2, 7, 19], 533: [13, 41], 534: [2, 3, 89], 535: [5, 107], 536: [2, 2, 2, 67], 537: [3, 179], 538: [2, 269], 539: [7, 7, 11], 540: [2, 2, 3, 3, 3, 5], 541: [541], 542: [2, 271], 543: [3, 181], 544: [2, 2, 2, 2, 2, 17], 545: [5, 109], 546: [2, 3, 7, 13], 547: [547], 548: [2, 2, 137], 549: [3, 3, 61], 550: [2, 5, 5, 11], 551: [19, 29], 552: [2, 2, 2, 3, 23], 553: [7, 79], 554: [2, 277], 555: [3, 5, 37], 556: [2, 2, 139], 557: [557], 558: [2, 3, 3, 31], 559: [13, 43], 560: [2, 2, 2, 2, 5, 7], 561: [3, 11, 17], 562: [2, 281], 563: [563], 564: [2, 2, 3, 47], 565: [5, 113], 566: [2, 283], 567: [3, 3, 3, 3, 7], 568: [2, 2, 2, 71], 569: [569], 570: [2, 3, 5, 19], 571: [571], 572: [2, 2, 11, 13], 573: [3, 191], 574: [2, 7, 41], 575: [5, 5, 23], 576: [2, 2, 2, 2, 2, 2, 3, 3], 577: [577], 578: [2, 17, 17], 579: [3, 193], 580: [2, 2, 5, 29], 581: [7, 83], 582: [2, 3, 97], 583: [11, 53], 584: [2, 2, 2, 73], 585: [3, 3, 5, 13], 586: [2, 293], 587: [587], 588: [2, 2, 3, 7, 7], 589: [19, 31], 590: [2, 5, 59], 591: [3, 197], 592: [2, 2, 2, 2, 37], 593: [593], 594: [2, 3, 3, 3, 11], 595: [5, 7, 17], 596: [2, 2, 149], 597: [3, 199], 598: [2, 13, 23], 599: [599], 600: [2, 2, 2, 3, 5, 5], 601: [601], 602: [2, 7, 43], 603: [3, 3, 67], 604: [2, 2, 151], 605: [5, 11, 11], 606: [2, 3, 101], 607: [607], 608: [2, 2, 2, 2, 2, 19], 609: [3, 7, 29], 610: [2, 5, 61], 611: [13, 47], 612: [2, 2, 3, 3, 17], 613: [613], 614: [2, 307], 615: [3, 5, 41], 616: [2, 2, 2, 7, 11], 617: [617], 618: [2, 3, 103], 619: [619], 620: [2, 2, 5, 31], 621: [3, 3, 3, 23], 622: [2, 311], 623: [7, 89], 624: [2, 2, 2, 2, 3, 13], 625: [5, 5, 5, 5], 626: [2, 313], 627: [3, 11, 19], 628: [2, 2, 157], 629: [17, 37], 630: [2, 3, 3, 5, 7], 631: [631], 632: [2, 2, 2, 79], 633: [3, 211], 634: [2, 317], 635: [5, 127], 636: [2, 2, 3, 53], 637: [7, 7, 13], 638: [2, 11, 29], 639: [3, 3, 71], 640: [2, 2, 2, 2, 2, 2, 2, 5], 641: [641], 642: [2, 3, 107], 643: [643], 644: [2, 2, 7, 23], 645: [3, 5, 43], 646: [2, 17, 19], 647: [647], 648: [2, 2, 2, 3, 3, 3, 3], 649: [11, 59], 650: [2, 5, 5, 13], 651: [3, 7, 31], 652: [2, 2, 163], 653: [653], 654: [2, 3, 109], 655: [5, 131], 656: [2, 2, 2, 2, 41], 657: [3, 3, 73], 658: [2, 7, 47], 659: [659], 660: [2, 2, 3, 5, 11], 661: [661], 662: [2, 331], 663: [3, 13, 17], 664: [2, 2, 2, 83], 665: [5, 7, 19], 666: [2, 3, 3, 37], 667: [23, 29], 668: [2, 2, 167], 669: [3, 223], 670: [2, 5, 67], 671: [11, 61], 672: [2, 2, 2, 2, 2, 3, 7], 673: [673], 674: [2, 337], 675: [3, 3, 3, 5, 5], 676: [2, 2, 13, 13], 677: [677], 678: [2, 3, 113], 679: [7, 97], 680: [2, 2, 2, 5, 17], 681: [3, 227], 682: [2, 11, 31], 683: [683], 684: [2, 2, 3, 3, 19], 685: [5, 137], 686: [2, 7, 7, 7], 687: [3, 229], 688: [2, 2, 2, 2, 43], 689: [13, 53], 690: [2, 3, 5, 23], 691: [691], 692: [2, 2, 173], 693: [3, 3, 7, 11], 694: [2, 347], 695: [5, 139], 696: [2, 2, 2, 3, 29], 697: [17, 41], 698: [2, 349], 699: [3, 233], 700: [2, 2, 5, 5, 7], 701: [701], 702: [2, 3, 3, 3, 13], 703: [19, 37], 704: [2, 2, 2, 2, 2, 2, 11], 705: [3, 5, 47], 706: [2, 353], 707: [7, 101], 708: [2, 2, 3, 59], 709: [709], 710: [2, 5, 71], 711: [3, 3, 79], 712: [2, 2, 2, 89], 713: [23, 31], 714: [2, 3, 7, 17], 715: [5, 11, 13], 716: [2, 2, 179], 717: [3, 239], 718: [2, 359], 719: [719], 720: [2, 2, 2, 2, 3, 3, 5], 721: [7, 103], 722: [2, 19, 19], 723: [3, 241], 724: [2, 2, 181], 725: [5, 5, 29], 726: [2, 3, 11, 11], 727: [727], 728: [2, 2, 2, 7, 13], 729: [3, 3, 3, 3, 3, 3], 730: [2, 5, 73], 731: [17, 43], 732: [2, 2, 3, 61], 733: [733], 734: [2, 367], 735: [3, 5, 7, 7], 736: [2, 2, 2, 2, 2, 23], 737: [11, 67], 738: [2, 3, 3, 41], 739: [739], 740: [2, 2, 5, 37], 741: [3, 13, 19], 742: [2, 7, 53], 743: [743], 744: [2, 2, 2, 3, 31], 745: [5, 149], 746: [2, 373], 747: [3, 3, 83], 748: [2, 2, 11, 17], 749: [7, 107], 750: [2, 3, 5, 5, 5], 751: [751], 752: [2, 2, 2, 2, 47], 753: [3, 251], 754: [2, 13, 29], 755: [5, 151], 756: [2, 2, 3, 3, 3, 7], 757: [757], 758: [2, 379], 759: [3, 11, 23], 760: [2, 2, 2, 5, 19], 761: [761], 762: [2, 3, 127], 763: [7, 109], 764: [2, 2, 191], 765: [3, 3, 5, 17], 766: [2, 383], 767: [13, 59], 768: [2, 2, 2, 2, 2, 2, 2, 2, 3], 769: [769], 770: [2, 5, 7, 11], 771: [3, 257], 772: [2, 2, 193], 773: [773], 774: [2, 3, 3, 43], 775: [5, 5, 31], 776: [2, 2, 2, 97], 777: [3, 7, 37], 778: [2, 389], 779: [19, 41], 780: [2, 2, 3, 5, 13], 781: [11, 71], 782: [2, 17, 23], 783: [3, 3, 3, 29], 784: [2, 2, 2, 2, 7, 7], 785: [5, 157], 786: [2, 3, 131], 787: [787], 788: [2, 2, 197], 789: [3, 263], 790: [2, 5, 79], 791: [7, 113], 792: [2, 2, 2, 3, 3, 11], 793: [13, 61], 794: [2, 397], 795: [3, 5, 53], 796: [2, 2, 199], 797: [797], 798: [2, 3, 7, 19], 799: [17, 47], 800: [2, 2, 2, 2, 2, 5, 5], 801: [3, 3, 89], 802: [2, 401], 803: [11, 73], 804: [2, 2, 3, 67], 805: [5, 7, 23], 806: [2, 13, 31], 807: [3, 269], 808: [2, 2, 2, 101], 809: [809], 810: [2, 3, 3, 3, 3, 5], 811: [811], 812: [2, 2, 7, 29], 813: [3, 271], 814: [2, 11, 37], 815: [5, 163], 816: [2, 2, 2, 2, 3, 17], 817: [19, 43], 818: [2, 409], 819: [3, 3, 7, 13], 820: [2, 2, 5, 41], 821: [821], 822: [2, 3, 137], 823: [823], 824: [2, 2, 2, 103], 825: [3, 5, 5, 11], 826: [2, 7, 59], 827: [827], 828: [2, 2, 3, 3, 23], 829: [829], 830: [2, 5, 83], 831: [3, 277], 832: [2, 2, 2, 2, 2, 2, 13], 833: [7, 7, 17], 834: [2, 3, 139], 835: [5, 167], 836: [2, 2, 11, 19], 837: [3, 3, 3, 31], 838: [2, 419], 839: [839], 840: [2, 2, 2, 3, 5, 7], 841: [29, 29], 842: [2, 421], 843: [3, 281], 844: [2, 2, 211], 845: [5, 13, 13], 846: [2, 3, 3, 47], 847: [7, 11, 11], 848: [2, 2, 2, 2, 53], 849: [3, 283], 850: [2, 5, 5, 17], 851: [23, 37], 852: [2, 2, 3, 71], 853: [853], 854: [2, 7, 61], 855: [3, 3, 5, 19], 856: [2, 2, 2, 107], 857: [857], 858: [2, 3, 11, 13], 859: [859], 860: [2, 2, 5, 43], 861: [3, 7, 41], 862: [2, 431], 863: [863], 864: [2, 2, 2, 2, 2, 3, 3, 3], 865: [5, 173], 866: [2, 433], 867: [3, 17, 17], 868: [2, 2, 7, 31], 869: [11, 79], 870: [2, 3, 5, 29], 871: [13, 67], 872: [2, 2, 2, 109], 873: [3, 3, 97], 874: [2, 19, 23], 875: [5, 5, 5, 7], 876: [2, 2, 3, 73], 877: [877], 878: [2, 439], 879: [3, 293], 880: [2, 2, 2, 2, 5, 11], 881: [881], 882: [2, 3, 3, 7, 7], 883: [883], 884: [2, 2, 13, 17], 885: [3, 5, 59], 886: [2, 443], 887: [887], 888: [2, 2, 2, 3, 37], 889: [7, 127], 890: [2, 5, 89], 891: [3, 3, 3, 3, 11], 892: [2, 2, 223], 893: [19, 47], 894: [2, 3, 149], 895: [5, 179], 896: [2, 2, 2, 2, 2, 2, 2, 7], 897: [3, 13, 23], 898: [2, 449], 899: [29, 31], 900: [2, 2, 3, 3, 5, 5], 901: [17, 53], 902: [2, 11, 41], 903: [3, 7, 43], 904: [2, 2, 2, 113], 905: [5, 181], 906: [2, 3, 151], 907: [907], 908: [2, 2, 227], 909: [3, 3, 101], 910: [2, 5, 7, 13], 911: [911], 912: [2, 2, 2, 2, 3, 19], 913: [11, 83], 914: [2, 457], 915: [3, 5, 61], 916: [2, 2, 229], 917: [7, 131], 918: [2, 3, 3, 3, 17], 919: [919], 920: [2, 2, 2, 5, 23], 921: [3, 307], 922: [2, 461], 923: [13, 71], 924: [2, 2, 3, 7, 11], 925: [5, 5, 37], 926: [2, 463], 927: [3, 3, 103], 928: [2, 2, 2, 2, 2, 29], 929: [929], 930: [2, 3, 5, 31], 931: [7, 7, 19], 932: [2, 2, 233], 933: [3, 311], 934: [2, 467], 935: [5, 11, 17], 936: [2, 2, 2, 3, 3, 13], 937: [937], 938: [2, 7, 67], 939: [3, 313], 940: [2, 2, 5, 47], 941: [941], 942: [2, 3, 157], 943: [23, 41], 944: [2, 2, 2, 2, 59], 945: [3, 3, 3, 5, 7], 946: [2, 11, 43], 947: [947], 948: [2, 2, 3, 79], 949: [13, 73], 950: [2, 5, 5, 19], 951: [3, 317], 952: [2, 2, 2, 7, 17], 953: [953], 954: [2, 3, 3, 53], 955: [5, 191], 956: [2, 2, 239], 957: [3, 11, 29], 958: [2, 479], 959: [7, 137], 960: [2, 2, 2, 2, 2, 2, 3, 5], 961: [31, 31], 962: [2, 13, 37], 963: [3, 3, 107], 964: [2, 2, 241], 965: [5, 193], 966: [2, 3, 7, 23], 967: [967], 968: [2, 2, 2, 11, 11], 969: [3, 17, 19], 970: [2, 5, 97], 971: [971], 972: [2, 2, 3, 3, 3, 3, 3], 973: [7, 139], 974: [2, 487], 975: [3, 5, 5, 13], 976: [2, 2, 2, 2, 61], 977: [977], 978: [2, 3, 163], 979: [11, 89], 980: [2, 2, 5, 7, 7], 981: [3, 3, 109], 982: [2, 491], 983: [983], 984: [2, 2, 2, 3, 41], 985: [5, 197], 986: [2, 17, 29], 987: [3, 7, 47], 988: [2, 2, 13, 19], 989: [23, 43], 990: [2, 3, 3, 5, 11], 991: [991], 992: [2, 2, 2, 2, 2, 31], 993: [3, 331], 994: [2, 7, 71], 995: [5, 199], 996: [2, 2, 3, 83], 997: [997], 998: [2, 499], 999: [3, 3, 3, 37], 1000: [2, 2, 2, 5, 5, 5]} + + +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_primes(): + it = primes() + for prime in PRIMES: + assert prime == next(it) + + +def test_prime_factorize(): + for prime in PRIMES: + assert list(prime_factorize(prime)) == [prime] + prime_factors: Iterable[tuple[int, Iterable[int]]] = [ + (n, list(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 list(prime_factorize(0)) == [] + assert list(prime_factorize(1)) == [] + assert list(prime_factorize(-2)) == []