Liste des Groupes | Revenir à cl c++ |
Michael S <already5chosen@yahoo.com> writes:
On Wed, 18 Dec 2024 01:33:42 +0200
Michael S <already5chosen@yahoo.com> wrote:
I am pretty sure that better variant exists, but for tonight it's>
enough.
Morning fibs.
>
Recursive:
>
struct pair_t {
long long a,b;
};
>
// return .a=fib(n), .b=fib(n+1)
static struct pair_t fib2(long n)
{
if (n <= 0) {
struct pair_t ret = { .a = 0, .b = n==0 ? 1 : 0 };
return ret;
}
// for n > 0
// fib(n*2) = (fib(n-1)+fib(n+1))*fib(n)
// fib(n*2+1) = fib(n)*fib(n)+fib(n+1)*fib(n+1)
long m = (n-1) >> 1;
struct pair_t ret = fib2(m);
long long a = ret.a, b = ret.b;
long long c = a + b;
if ((n & 1)==0) { // (m,m+1) => ((m+1)*2,(m+1)*2*2+1)
ret.a = (a + c)*b;
ret.b = b*b + c*c;
} else { // (m,m+1) => (m*2+1,(m+1)*2)
ret.a = a*a + b*b;
ret.b = (a + c)*b;
}
return ret;
}
>
static long long fib(long n)
{
struct pair_t x = fib2(n-1);
return x.b;
}
I may have inadvertently misled you. Here is a simple linear
formulation that uses recursion:
typedef unsigned long long NN;
static NN fibonacci_3( NN, NN, unsigned );
NN
fibonacci( unsigned n ){
return fibonacci_3( 1, 0, n );
}
NN
fibonacci_3( NN a, NN b, unsigned n ){
return n == 0 ? b : fibonacci_3( b, a+b, n-1 );
}
Can you apply this idea to your logarithmic scheme?
Les messages affichés proviennent d'usenet.