2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 [Mathematica] 10^100 Число Фибоначчи
Сообщение31.05.2012, 20:03 
Доброго времени суток, друзья.
Конечно, само число Фибоначчи по номеру 10^100 найти нереально (оно не поместится на экран), поэтому я хотел бы найти хотя бы последние 10 знаков :-)
FromDigits к генерации числа Фибоначчи заданного номера так же ничего не дало. Думаю, здесь нужно использовать какое то св-во чисел, что-то типа 80, 180, 280 - у них есть какая то закономерность...

У кого какие идеи?

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение31.05.2012, 20:13 
Считать в матричном виде по модулю $10^{10}$.

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение31.05.2012, 20:28 
venco, по модулю? Это как понять? или это из св-в числа Фибоначчи?

матричный вид, это я понимаю так: (написал функцию)
Код:
fibonacArtur[n_Integer?NonNegative] :=
MatrixPower[{{0, 1}, {1, 1}}, n - 1]

MatrixPowerMod использовать ? - к сожалению подобной функции нету (наряду с PowerMod для чисел).

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение31.05.2012, 20:36 
Ну, напишите возведение в степень по модулю вручную, матрицы маленькие, должно быть несложно.

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение31.05.2012, 22:05 
coll3ctor в сообщении #579063 писал(а):
поэтому я хотел бы найти хотя бы последние 10 знаков :-)
Что так скромно? Найдите хотя бы 1000.

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение11.06.2012, 12:41 
а другой путь к решению этой задачи есть?

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение11.06.2012, 13:49 
coll3ctor в сообщении #583365 писал(а):
а другой путь к решению этой задачи есть?
Матрицы не нравятся? Работайте с многочленами. Принципиально иного пути нет.

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение11.06.2012, 14:12 
Последние сто цифр равны 5690012597958236757558633467085120672027553533794679994830406632999597604793962091207504272460937501, если найдены верно.

Вот наипрямейшая реализация, которую можно сильно улучшить. Срабатывает у меня за доли секунды.

Код:
MatrixPowerMod[m_, 0, n_] := Mod[IdentityMatrix[Length[m]], n]
MatrixPowerMod[m_, p_Integer?Positive, n_] :=
  Block[
    {t = MatrixPowerMod[m, Floor[p/2], n]},
    If[
      EvenQ[p],
      Mod[t.t, n],
      Mod[t.t.m, n]
    ]
  ]

(* Как использовано: *)
Block[
  {$RecursionLimit = 1024},
  MatrixPowerMod[{{0, 1}, {1, 1}}, 10^100, 10^100][[2, 2]]
]
Как видно, если рекурсию преобразовать в цикл, будет проще работать с этой махиной — не будет $RecursionLimit::reclim (а было — стандартных 256 итераций не хватает).

-- Пн июн 11, 2012 17:16:34 --

Кстати, возможно, я номер числа перепутал и он должен быть на 1 больше-меньше. :roll:

-- Пн июн 11, 2012 17:19:03 --

Первое определение в MatrixPowerMod нужно для модулей не из $\mathbb Z_{>1}$.

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение11.06.2012, 14:41 
arseniiv
Великолепно! Крайне интересно! Спасибо! А не объясните пожалуйста что да как ?

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение11.06.2012, 15:16 
Ну, тут для возведения в степень используется алгоритм за $O(\log n)$, вроде лучше с натуральным показателем и не сделать (точно не помню).

Этот алгоритм основан на свойствах степени (верно для любого моноида), выписанных в таком виде:
$\begin{array}{l} M^{2n} = M^n M^n, \\ M^{2n + 1} = M^{2n} M, \\ M^0 = I. \end{array}$

Остаётся только вовремя произведения брать по модулю.

Кстати, можно было написать немного лучше + нагляднее: вместо
Код:
If[
  EvenQ[p],
  Mod[t.t, n],
  Mod[t.t.m, n]
]
написать
Код:
Mod[If[EvenQ[p], t.t, t.t.m], n]

-- Пн июн 11, 2012 18:18:39 --

(Мне кажется, для умножения по модулю должны быть алгоритмы и получше.)

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение11.06.2012, 20:38 
arseniiv
1. А зачем оператор Block?
2. Почему если мы берём матрицу для поиска чисел Фибоначчии в степень 10^100 и получаем именно 100 чисел последних? Это какое то свойство $\mod$ - самой операции?

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение11.06.2012, 21:42 
coll3ctor в сообщении #583550 писал(а):
1. А зачем оператор Block?
Чтобы завести локальную переменную t.

coll3ctor в сообщении #583550 писал(а):
2. Почему если мы берём матрицу для поиска чисел Фибоначчии в степень 10^100 и получаем именно 100 чисел последних? Это какое то свойство $\mod$ - самой операции?
Ага. Остаток от деления на 10000 совпадает с последними четырьмя цифрами числа. Соответственно, взятие числа по модулю $10^{100}$ оставляет только сто младших его разрядов, остальные выбрасывая.

 
 
 
 Re: [Mathematica] 10^100 Число Фибоначчи
Сообщение12.06.2012, 16:39 
arseniiv
Спасибо! Всё очень понятно и да, решение можно улучшить, но и это очень изящно и продуктивно.

(Оффтоп)

благодаря вам получил около 10 лишних баллов на зачёт, только оттуда

И да, тему клоз.

 
 
 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group