Advertisement
apexsquirt

[PHP-CLI] Collatz checker

Jul 12th, 2018
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. <?php
  2. function add($x,$y) {
  3. $a = min($x,$y);
  4. $b = max($x,$y);
  5. $x = strval($a);
  6. $y = strval($b);
  7. $r = 0;
  8. if (strlen($x) < strlen($y)) {
  9. $t = strlen($y)-strlen($x);
  10. for ($i = 0; $i < strlen(max($x,$y)); $i++) {
  11. if (!is_numeric($x[$i])) { $x[$i] = 0; }
  12. if (!is_numeric($y[$i])) { $y[$i] = 0; }
  13. }
  14. for ($i = 0; $i < strlen(max($x,$y)) - $t; $i++) {
  15. $zz[$t+$i] = $x[$i];
  16. }
  17. for ($i = 0; $i < $t; $i++) {
  18. $zz[$i] = 0;
  19. }
  20. for ($i = strlen($y) - 1; $i >= 0; $i--) {
  21. $p = strval($zz[$i]+$y[$i]+$r);
  22. $ld[$i] = $p[strlen($p)-1];
  23. $r = floor(($zz[$i]+$y[$i]+$r)/10);
  24. }
  25. $ld[-1] = $r;
  26. if ($ld[-1] > 0) {
  27. for ($i = -1; $i < count($ld); $i++) {
  28. $str .= $ld[$i];
  29. }
  30. } else {
  31. for ($i = 0; $i < count($ld); $i++) {
  32. $str .= $ld[$i];
  33. }
  34. }
  35. } elseif (strlen($x) == strlen($y) && strlen($x) > 1) {
  36. $t = strlen($y)-strlen($x);
  37. for ($i = 0; $i < strlen(max($x,$y)); $i++) {
  38. if (!is_numeric($x[$i])) { $x[$i] = 0; }
  39. if (!is_numeric($y[$i])) { $y[$i] = 0; }
  40. }
  41. for ($i = strlen($y) - 1; $i >= 0; $i--) {
  42. $p = strval($x[$i]+$y[$i]+$r);
  43. $ld[$i] = $p[strlen($p)-1];
  44. $r = floor(($x[$i]+$y[$i]+$r)/10);
  45. }
  46. $ld[-1] = $r;
  47. if ($ld[-1] > 0) {
  48. for ($i = -1; $i < count($ld); $i++) {
  49. $str .= $ld[$i];
  50. }
  51. } else {
  52. for ($i = 0; $i < count($ld); $i++) {
  53. $str .= $ld[$i];
  54. }
  55. }
  56. } else {
  57. $str = $x + $y;
  58. }
  59. return $str;
  60. }
  61. function div_2($n) {
  62. $m = strlen(strval($n));
  63. $n = strval($n);
  64. for ($i = $m - 1; $i >= 0; $i--) {
  65. $p[$i] += floor($n[$i]/2);
  66. if ($n[$i]/2-floor($n[$i]/2) != 0) { $p[$i+1] += 5; }
  67. }
  68. if ($p[0] == 0) {
  69. for ($i = 1; $i < $m; $i++) {
  70. $str .= $p[$i];
  71. }
  72. } else {
  73. for ($i = 0; $i < $m; $i++) {
  74. $str .= $p[$i];
  75. }
  76. }
  77. if ($p[$m] == 5) { $gok = 1; }
  78. else { $gok = 0; }
  79. return [$str,$gok];
  80. }
  81. function mult($m,$n) {
  82. $s = $m;
  83. for ($i = 2; $i <= $n; $i++) {
  84. $s = add($m,$s);
  85. }
  86. return $s;
  87. }
  88. function collatz($n) {
  89. $array1 = div_2($n);
  90. $array2 = div_2(add(mult($n,3),"1"));
  91. if ($array1[1] == 0) { return $array1[0]; }
  92. else { return $array2[0]; }
  93. }
  94. $i = "5764607523034835996"; //i've tested all numbers between this 1.25x2^68 and this one
  95. while ($i != "6000000000000000000") {
  96. $i = add($i,1);
  97. $b = $i;
  98. if (intval($b[strlen($b) - 1]) == 0 || intval($b[strlen($b) - 1]) == 5) { print "$b - 1 checked\n"; }
  99. while ($b != "1") {
  100. $b = collatz($b);
  101. }
  102. }
  103. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement