состав числа, где число очень большое

Я пытаюсь вычислить количество способов композиции числа, используя числа 1 и 2. Это можно найти, используя ряды Фибоначчи, где F(1)=1 и F(2)=2 и

F(n)=F(n-1)+F(n-2)

Поскольку F(n) может быть очень большим, мне просто нужно F(n)%1000000007. Чтобы ускорить процесс, я использую возведение в степень Фибоначчи. Я написал два кода для одной и той же проблемы (оба почти похожи). Но один из них не работает для больших чисел. Я не могу понять, какой из них правильный?

CODE 1

http://ideone.com/iCPEyz

CODE 2

http://ideone.com/Un5p2S

Хотя у меня есть ощущение, что первое должно быть правильным. Я не могу понять, что произойдет, когда есть случай, например, когда мы умножаем, скажем, a и b, а значение a уже превысило верхний предел a и когда мы умножаем это b, тогда насколько я могу быть уверен, что a*b правильно. Насколько мне известно, если значение a превышает пределы его типа данных, то значение начинается снова с самого низкого значения, как в приведенном ниже примере.

#include<iostream>
#include<limits.h>
using namespace std;
int main()
{
    cout<<UINT_MAX<<endl;
    cout<<UINT_MAX+2;
}

Output

4294967295

1

person g4ur4v    schedule 03.02.2013    source источник
comment
Не могу не заметить отсутствие вопросительного знака.   -  person Mr Lister    schedule 03.02.2013
comment
Ваши знания верны (в C и C++) только для целочисленных типов без знака. Для знаковых интегралов это поведение undefined.   -  person Matthieu M.    schedule 03.02.2013
comment
Не прямой ответ на ваш вопрос, но для решения проблемы Fimodacci вы можете не ждать до конца, чтобы сделать по модулю. Многие такие проблемы поддаются такому подходу. См. mathblog.dk/uva-10229-modular-fibonacci.   -  person LSerni    schedule 03.02.2013


Ответы (1)


«Переполнение» (на самом деле вы не называете это для беззнаковых, они обтекают) беззнаковых n-битных типов будут сохранять значения только по модулю 2 ^ n, а не по модулю произвольного модуля (как они могли? Попробуйте воспроизвести шаги с ручка и бумага). Поэтому вы должны убедиться, что ни одна операция никогда не выходит за пределы вашего типа, чтобы поддерживать правильные результаты по модулю 100000007.

person us2012    schedule 03.02.2013