IntegerIsPrimeTest.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. <?php
  2. namespace MathPHP\Tests\NumberTheory;
  3. use MathPHP\NumberTheory\Integer;
  4. use MathPHP\Sequence\Advanced;
  5. class IntegerIsPrimeTest extends \PHPUnit\Framework\TestCase
  6. {
  7. /**
  8. * @test isPrime
  9. * @dataProvider dataProviderForPrimeNumbers
  10. * @dataProvider dataProviderForSuperPrimeNumbers
  11. * @param int $n
  12. */
  13. public function testIsPrime(int $n)
  14. {
  15. // When
  16. $isPrime = Integer::isPrime($n);
  17. // Then
  18. $this->assertTrue($isPrime);
  19. }
  20. /**
  21. * @return array
  22. */
  23. public function dataProviderForPrimeNumbers(): array
  24. {
  25. return [
  26. [2],
  27. [3],
  28. [5],
  29. [7],
  30. [11],
  31. [13],
  32. [17],
  33. [19],
  34. [23],
  35. [29],
  36. [31],
  37. [37],
  38. [41],
  39. [43],
  40. [47],
  41. [53],
  42. [59],
  43. [61],
  44. [67],
  45. [71],
  46. [73],
  47. [79],
  48. [83],
  49. [89],
  50. [97],
  51. [101],
  52. [103],
  53. [107],
  54. [109],
  55. [113],
  56. [127],
  57. [131],
  58. [137],
  59. [139],
  60. [149],
  61. [151],
  62. [157],
  63. [163],
  64. [167],
  65. [173],
  66. [179],
  67. [181],
  68. [191],
  69. [193],
  70. [197],
  71. [199],
  72. [211],
  73. [223],
  74. [227],
  75. [229],
  76. [233],
  77. [239],
  78. [241],
  79. [251],
  80. [257],
  81. [263],
  82. [269],
  83. [271],
  84. [277],
  85. [281],
  86. [283],
  87. [293],
  88. [307],
  89. [311],
  90. [313],
  91. [317],
  92. [331],
  93. [337],
  94. [347],
  95. [349],
  96. [353],
  97. [359],
  98. [367],
  99. [373],
  100. [379],
  101. [383],
  102. [389],
  103. [397],
  104. [401],
  105. [409],
  106. [419],
  107. [421],
  108. [431],
  109. [433],
  110. [439],
  111. [443],
  112. [449],
  113. [457],
  114. [461],
  115. [463],
  116. [467],
  117. [479],
  118. [487],
  119. [491],
  120. [499],
  121. [503],
  122. [509],
  123. [521],
  124. [523],
  125. [541],
  126. [547],
  127. [557],
  128. [563],
  129. [569],
  130. [571],
  131. [577],
  132. [587],
  133. [593],
  134. [599],
  135. [601],
  136. [607],
  137. [613],
  138. [617],
  139. [619],
  140. [631],
  141. [641],
  142. [643],
  143. [647],
  144. [653],
  145. [659],
  146. [661],
  147. [673],
  148. [677],
  149. [683],
  150. [691],
  151. [701],
  152. [709],
  153. [719],
  154. [727],
  155. [733],
  156. [739],
  157. [743],
  158. [751],
  159. [757],
  160. [761],
  161. [769],
  162. [773],
  163. [787],
  164. [797],
  165. [809],
  166. [811],
  167. [821],
  168. [823],
  169. [827],
  170. [829],
  171. [839],
  172. [853],
  173. [857],
  174. [859],
  175. [863],
  176. [877],
  177. [881],
  178. [883],
  179. [887],
  180. [907],
  181. [911],
  182. [919],
  183. [929],
  184. [937],
  185. [941],
  186. [947],
  187. [953],
  188. [967],
  189. [971],
  190. [977],
  191. [983],
  192. [991],
  193. [997],
  194. [1009],
  195. [1013],
  196. [1019],
  197. [1021],
  198. [1031],
  199. [1033],
  200. [1039],
  201. [1049],
  202. [1051],
  203. [1061],
  204. [1063],
  205. [1069],
  206. [1087],
  207. [1091],
  208. [1093],
  209. [1097],
  210. [1103],
  211. [1109],
  212. [1117],
  213. [1123],
  214. [1129],
  215. [1151],
  216. [1153],
  217. [1163],
  218. [1171],
  219. [1181],
  220. [1187],
  221. [1193],
  222. [1201],
  223. [1213],
  224. [1217],
  225. [1223],
  226. [1229],
  227. [1231],
  228. [1237],
  229. [1249],
  230. [1259],
  231. [1277],
  232. [1279],
  233. [1283],
  234. [1289],
  235. [1291],
  236. [1297],
  237. [1301],
  238. [1303],
  239. [1307],
  240. [1319],
  241. [1321],
  242. [1327],
  243. [1361],
  244. [1367],
  245. [1373],
  246. [1381],
  247. [1399],
  248. [1409],
  249. [1423],
  250. [1427],
  251. [1429],
  252. [1433],
  253. [1439],
  254. [1447],
  255. [1451],
  256. [1453],
  257. [1459],
  258. [1471],
  259. [1481],
  260. [1483],
  261. [1487],
  262. [1489],
  263. [1493],
  264. [1499],
  265. [1511],
  266. [1523],
  267. [1531],
  268. [1543],
  269. [1549],
  270. [1553],
  271. [1559],
  272. [1567],
  273. [1571],
  274. [1579],
  275. [1583],
  276. [1597],
  277. [1601],
  278. [1607],
  279. [1609],
  280. [1613],
  281. [1619],
  282. [1621],
  283. [1627],
  284. [1637],
  285. [1657],
  286. [1663],
  287. [1667],
  288. [1669],
  289. [1693],
  290. [1697],
  291. [1699],
  292. [1709],
  293. [1721],
  294. [1723],
  295. [1733],
  296. [1741],
  297. [1747],
  298. [1753],
  299. [1759],
  300. [1777],
  301. [1783],
  302. [1787],
  303. [1789],
  304. [1801],
  305. [1811],
  306. [1823],
  307. [1831],
  308. [1847],
  309. [1861],
  310. [1867],
  311. [1871],
  312. [1873],
  313. [1877],
  314. [1879],
  315. [1889],
  316. [1901],
  317. [1907],
  318. [1913],
  319. [1931],
  320. [1933],
  321. [1949],
  322. [1951],
  323. [1973],
  324. [1979],
  325. [1987],
  326. [1993],
  327. [1997],
  328. [1999],
  329. [2003],
  330. [2011],
  331. [2017],
  332. [2027],
  333. [2029],
  334. [2039],
  335. [2053],
  336. [2063],
  337. [2069],
  338. [2081],
  339. [2083],
  340. [2087],
  341. [2089],
  342. [2099],
  343. [2111],
  344. [2113],
  345. [2129],
  346. [2131],
  347. [2137],
  348. [2141],
  349. [2143],
  350. [2153],
  351. [2161],
  352. [2179],
  353. [2203],
  354. [2207],
  355. [2213],
  356. [2221],
  357. [2237],
  358. [2239],
  359. [2243],
  360. [2251],
  361. [2267],
  362. [2269],
  363. [2273],
  364. [2281],
  365. [2287],
  366. [2293],
  367. [2297],
  368. [2309],
  369. [2311],
  370. [2333],
  371. [2339],
  372. [2341],
  373. [2347],
  374. [2351],
  375. [2357],
  376. [2371],
  377. [2377],
  378. [2381],
  379. [2383],
  380. [2389],
  381. [2393],
  382. [2399],
  383. [2411],
  384. [2417],
  385. [2423],
  386. [2437],
  387. [2441],
  388. [2447],
  389. [2459],
  390. [2467],
  391. [2473],
  392. [2477],
  393. [2503],
  394. [2521],
  395. [2531],
  396. [2539],
  397. [2543],
  398. [2549],
  399. [2551],
  400. [2557],
  401. [2579],
  402. [2591],
  403. [2593],
  404. [2609],
  405. [2617],
  406. [2621],
  407. [2633],
  408. [2647],
  409. [2657],
  410. [2659],
  411. [2663],
  412. [2671],
  413. [2677],
  414. [2683],
  415. [2687],
  416. [2689],
  417. [2693],
  418. [2699],
  419. [2707],
  420. [2711],
  421. [2713],
  422. [2719],
  423. [2729],
  424. [2731],
  425. [2741],
  426. [2749],
  427. [2753],
  428. [2767],
  429. [2777],
  430. [2789],
  431. [2791],
  432. [2797],
  433. [2801],
  434. [2803],
  435. [2819],
  436. [2833],
  437. [2837],
  438. [2843],
  439. [2851],
  440. [2857],
  441. [2861],
  442. [2879],
  443. [2887],
  444. [2897],
  445. [2903],
  446. [2909],
  447. [2917],
  448. [2927],
  449. [2939],
  450. [2953],
  451. [2957],
  452. [2963],
  453. [2969],
  454. [2971],
  455. [2999],
  456. [3001],
  457. [3011],
  458. [3019],
  459. [3023],
  460. [3037],
  461. [3041],
  462. [3049],
  463. [3061],
  464. [3067],
  465. [3079],
  466. [3083],
  467. [3089],
  468. [3109],
  469. [3119],
  470. [3121],
  471. [3137],
  472. [3163],
  473. [3167],
  474. [3169],
  475. [3181],
  476. [3187],
  477. [3191],
  478. [3203],
  479. [3209],
  480. [3217],
  481. [3221],
  482. [3229],
  483. [3251],
  484. [3253],
  485. [3257],
  486. [3259],
  487. [3271],
  488. [3299],
  489. [3301],
  490. [3307],
  491. [3313],
  492. [3319],
  493. [3323],
  494. [3329],
  495. [3331],
  496. [3343],
  497. [3347],
  498. [3359],
  499. [3361],
  500. [3371],
  501. [3373],
  502. [3389],
  503. [3391],
  504. [3407],
  505. [3413],
  506. [3433],
  507. [3449],
  508. [3457],
  509. [3461],
  510. [3463],
  511. [3467],
  512. [3469],
  513. [3491],
  514. [3499],
  515. [3511],
  516. [3517],
  517. [3527],
  518. [3529],
  519. [3533],
  520. [3539],
  521. [3541],
  522. [3547],
  523. [3557],
  524. [3559],
  525. [3571],
  526. [3581],
  527. [3583],
  528. [3593],
  529. [3607],
  530. [3613],
  531. [3617],
  532. [3623],
  533. [3631],
  534. [3637],
  535. [3643],
  536. [3659],
  537. [3671],
  538. [3673],
  539. [3677],
  540. [3691],
  541. [3697],
  542. [3701],
  543. [3709],
  544. [3719],
  545. [3727],
  546. [3733],
  547. [3739],
  548. [3761],
  549. [3767],
  550. [3769],
  551. [3779],
  552. [3793],
  553. [3797],
  554. [3803],
  555. [3821],
  556. [3823],
  557. [3833],
  558. [3847],
  559. [3851],
  560. [3853],
  561. [3863],
  562. [3877],
  563. [3881],
  564. [3889],
  565. [3907],
  566. [3911],
  567. [3917],
  568. [3919],
  569. [3923],
  570. [3929],
  571. [3931],
  572. [3943],
  573. [3947],
  574. [3967],
  575. [3989],
  576. [4001],
  577. [4003],
  578. [4007],
  579. [4013],
  580. [4019],
  581. [4021],
  582. [4027],
  583. [4049],
  584. [4051],
  585. [4057],
  586. [4073],
  587. [4079],
  588. [4091],
  589. [4093],
  590. [4099],
  591. [4111],
  592. [4127],
  593. [4129],
  594. [4133],
  595. [4139],
  596. [4153],
  597. [4157],
  598. [4159],
  599. [4177],
  600. [4201],
  601. [4211],
  602. [4217],
  603. [4219],
  604. [4229],
  605. [4231],
  606. [4241],
  607. [4243],
  608. [4253],
  609. [4259],
  610. [4261],
  611. [4271],
  612. [4273],
  613. [4283],
  614. [4289],
  615. [4297],
  616. [4327],
  617. [4337],
  618. [4339],
  619. [4349],
  620. [4357],
  621. [4363],
  622. [4373],
  623. [4391],
  624. [4397],
  625. [4409],
  626. [4421],
  627. [4423],
  628. [4441],
  629. [4447],
  630. [4451],
  631. [4457],
  632. [4463],
  633. [4481],
  634. [4483],
  635. [4493],
  636. [4507],
  637. [4513],
  638. [4517],
  639. [4519],
  640. [4523],
  641. [4547],
  642. [4549],
  643. [4561],
  644. [4567],
  645. [4583],
  646. [4591],
  647. [4597],
  648. [4603],
  649. [4621],
  650. [4637],
  651. [4639],
  652. [4643],
  653. [4649],
  654. [4651],
  655. [4657],
  656. [4663],
  657. [4673],
  658. [4679],
  659. [4691],
  660. [4703],
  661. [4721],
  662. [4723],
  663. [4729],
  664. [4733],
  665. [4751],
  666. [4759],
  667. [4783],
  668. [4787],
  669. [4789],
  670. [4793],
  671. [4799],
  672. [4801],
  673. [4813],
  674. [4817],
  675. [4831],
  676. [4861],
  677. [4871],
  678. [4877],
  679. [4889],
  680. [4903],
  681. [4909],
  682. [4919],
  683. [4931],
  684. [4933],
  685. [4937],
  686. [4943],
  687. [4951],
  688. [4957],
  689. [4967],
  690. [4969],
  691. [4973],
  692. [4987],
  693. [4993],
  694. [4999],
  695. ];
  696. }
  697. /**
  698. * @return array
  699. */
  700. public function dataProviderForSuperPrimeNumbers(): array
  701. {
  702. return [
  703. [4535189],
  704. [131807699],
  705. [2724711961],
  706. [64988430769],
  707. [1765037224331],
  708. [53982894593057],
  709. ];
  710. }
  711. /**
  712. * @test isPrime - not prime
  713. * @dataProvider dataProviderForNonPrimeNumbers
  714. * @param int $n
  715. */
  716. public function testIsNotPrime(int $n)
  717. {
  718. // When
  719. $isPrime = Integer::isPrime($n);
  720. // Then
  721. $this->assertFalse($isPrime);
  722. }
  723. /**
  724. * @return array
  725. */
  726. public function dataProviderForNonPrimeNumbers(): array
  727. {
  728. return [
  729. [-3],
  730. [-2],
  731. [-1],
  732. [0],
  733. [1],
  734. [4],
  735. [6],
  736. [8],
  737. [9],
  738. [10],
  739. [12],
  740. [14],
  741. [15],
  742. [16],
  743. [18],
  744. [21],
  745. [20],
  746. [22],
  747. [24],
  748. [25],
  749. [26],
  750. [27],
  751. [28],
  752. [30],
  753. [32],
  754. [33],
  755. [34],
  756. [35],
  757. [36],
  758. [38],
  759. [39],
  760. [40],
  761. [42],
  762. [44],
  763. [45],
  764. [46],
  765. [48],
  766. [49],
  767. [50],
  768. [51],
  769. [52],
  770. [54],
  771. [56],
  772. [55],
  773. [57],
  774. [58],
  775. [60],
  776. [63],
  777. [62],
  778. [64],
  779. [65],
  780. [66],
  781. [69],
  782. [68],
  783. [70],
  784. [72],
  785. [75],
  786. [74],
  787. [76],
  788. [78],
  789. [77],
  790. [80],
  791. ];
  792. }
  793. /**
  794. * @test isPrime
  795. * @dataProvider dataProviderForPrimeNumberSequence
  796. * @param int $n
  797. */
  798. public function testIsPrimeUsingPrimeSequence(int $n)
  799. {
  800. // When
  801. $isPrime = Integer::isPrime($n);
  802. // Then
  803. $this->assertTrue($isPrime);
  804. }
  805. /**
  806. * @return \Generator
  807. */
  808. public function dataProviderForPrimeNumberSequence(): \Generator
  809. {
  810. foreach (Advanced::primesUpTo(100) as $prime) {
  811. yield [$prime];
  812. }
  813. }
  814. }