puggan icon

mp_20200515.php

puggan | PRO | 05/15/20 10:33:55 AM UTC | 0 ⭐ | 1784 👁️ | Never ⏰ | []
PHP |

1.28 KB

|

None

|

0 👍

/

0 👎

<?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