<?php
/*
* a & b is positive integers
* f(0) = a;
* f(1) = a + b;
* f(n) = f(n-1) + f(n-2)
* f(x) = 1e6, find a & b so that x get as high as posible
*
* g(0,a,b) = a
* g(1,a,b) = a+b
* g(n,a,b) = g(n-1,a,b) + g(n-2,a,b)
*
* g(n,0,1) => fibinatchii => g(31,0,1) > 1e6 => n < 31
* best found; g(18,144,154) = 1e6
* g(18,a,b) = 4181a + 2584b
* g(19,a,b) = 6765a + 4181b, x > 18 => 4181b < 1e6 => b < 240
*/
function fibMaker($a, $b) {
yield $a;
while(true) {
yield $b += $a;
yield $a += $b;
}
}
function serie($n = 0, $max = 240) {
while($n < $max) {
yield $n++;
}
}
function getX($a, $b, $goal = 1e6, $limit = 31) {
$fib = fibMaker($a,$b);
$index = 0;
foreach($fib as $n) {
if($n == $goal) {
return $index;
}
if($n > $goal) {
return 0;
}
if($index > $limit) {
return 0;
}
$index++;
}
return 0;
}
$best = 1;
foreach(serie(1) as $n1) {
echo $n1, "\r";
foreach(serie(0) as $n2) {
$x = getX($n1, $n2);
if($x >= $best) {
echo 'g(', $x, ',', $n1, ',', $n2, ') = 1e6', PHP_EOL;
$best = $x;
}
}
}
echo ' ', PHP_EOL;
Comments