![]() |
|
|
![]()
|
|
| Гость_Eugene |
|
|||
|
Unregistered |
Hello, ALL
Приветствую Вас, господа МАТЕМАТИКИ ! Возникла такая вот задача. Имеется 2 числовых ряда: ( в {} ,будут примеры ) a. Фибоначчи - { 1 2 3 5 8 13 ... } = R1 b. типа Фибоначчи - { 1 3 4 7 11 18 ... } = R2 на _заданном_ отрезке N { N ~ 8-ми байтовое целое, т.е. ~ 2^64 } Дано множество, вычисляемое по формуле: C = A * R % N , где С - вычисленный член множества А - заданная константа N - отрезок поиска, (N > R, мощность множества) R - _любое_ число из R1 или R2 % - операция "остаток от деления" в "C" , или mod(N) в математической записи НАЙТИ: R =?= A * R % N т. е. имеются ли пересечения рядов R и множества A * R % N, и найти это(и) пересечение(я) (по возможности). При решении задачи "в лоб" перебором, при N = 2^32 (4 байта) P3-833 в чистом DOS "дохнет" :-( Буду весьма признателен за помощь (желательно алгоритм). Удачи ! |
|||
|
||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
Найти пересечение достаточно просто - храни значение элемента множества в бите.
Т.е., сначала R1=R2=0; ... Ri = Ri-2 + Ri-1 R1 = R1 OR (1 SHL (CRi - 1)) Ну и т.д. А результат: Res1 = R1 AND C Res2 = R2 AND C останется просмотреть единичные биты.... -------------------- С уважением, А. Фролов. |
|||
|
||||
| Arush |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 10.11.2003 Репутация: нет Всего: 1 |
Задача сводится к следующей:
Пусть R3 = R1+R2. Для всех Ri принадлежащих R3, Ri<N, найти Rj принадлежащее R3, такое что Ri= ( A*Rj ) mod N , либо доказать что оно не существует. Если Rj должно быть меньше N, то : 1) Вычисляем R1 и R2 пока Ri < N (они будут содержать ~ по 60-70 членов) 2) Вычисляем С - оно будет содержать не более чем |R1| + |R2| членов. 3) Вычислем собственно пересечение. На все это потребуется несколько секунд машинного времени Если Rj может возрастать неограничено, то Ri=A*Rj mod N=A*(R(j-1)+R(j-2)) mod N = A*R(j-1) + A*R(j-2) mod N = ( (A*R(j-1) mod N ) + (A*R(j-2) mod N) mod N. Т.е. все вычисления ведем в группе вычетов по модулю N (вроде так если я не забыл). Соответственно алгоритм 3) получается примерно следующий:
Т.е. считаем пока не найдем разложение каждого члена множества R3, либо за 100 шагов не найдем ни одного нового члена(это конечно эвристика, а что делать Наверно имеет смысл ограничить число нерезультативных шагов не константой и функцией от N, например sqrt(N) или N. Удачи. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |