Primes.php

  1. <?php
  2. /*
  3. Primes.php — Francisco Cascales — 2017-11-26
  4. Versión más rápida "Primes.java"
  5.  
  6. - 50 millones de números primos.
  7. - Desde el primo 2 hasta el primo 982_451_653
  8.  
  9. Accede secuencialmente a los primos almacenados
  10. en los ficheros "primes1.txt" hasta "primes50.txt"
  11.  
  12. Uso:
  13. $primes = new Primes();
  14. while ($primes->hasNext()) {
  15. echo $primes->next();
  16. }
  17. $primes->close();
  18. */
  19. class Primes {
  20.  
  21. const PRIMES_PER_FILE = 1000000;
  22. const NUM_FILES = 50;
  23. const LAST_PRIME = 982451653;
  24.  
  25. private $numfile;
  26. private $numprime;
  27. private $file;
  28.  
  29. public function __construct() {
  30. $numfile = 0;
  31. $numprime = 0;
  32. $this->open();
  33. }
  34.  
  35. public function hasNext() {
  36. if ($this->numfile < self::NUM_FILES) return true;
  37. elseif ($this->numprime < self::PRIMES_PER_FILE) return true;
  38. else return false;
  39. }
  40.  
  41. public function next() {
  42. if ($this->numprime >= self::PRIMES_PER_FILE) {
  43. $this->close();
  44. $this->open();
  45. }
  46. $this->numprime++;
  47. return rtrim(fgets($this->file), "\n");
  48. }
  49.  
  50. public function close() {
  51. if ($this->numfile > 0) fclose($this->file);
  52. }
  53. private function open() {
  54. $this->numfile++;
  55. $this->numprime = 0;
  56. $filename = "primes/primes".$this->numfile.".txt";
  57. ////echo "$filename\n";
  58. $this->file = fopen($filename, "r") or exit("Unable to open file!");
  59. /*
  60. Reinicia el timeout del PHP 30 segundos más
  61. Parece que Telegram cuando ve que no recibe respuesta en mucho tiempo
  62. lo vuelve a intentar de nuevo realizando de nuevo la petición,
  63. entrando en un bucle sin fin.
  64. */
  65. }
  66.  
  67. }
  68.  

Proinf.net