IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Reply to this topicStart new topic
> Деление с остатком
FBX
сообщение 09 Apr 2010, 09:41
Сообщение #1

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




Нужно реализовать деление с остатком больших чисел, но не могу разобраться в алгоритме - и читабельного не нашел к сожалению. Везде какие-то неточности, и абсурдные на мой взгляд вещи.

Во-первых, глупейший вопрос: если я для хранения больших чисел использую, к примеру,
Код
type
 TDigit = array[0..63] of dword;


то наименьшему или наибольшему элементу массива логичнее хранить младшую часть числа?


--------------------
using namespace fbx;
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 09 Apr 2010, 10:00
Сообщение #2

Etoslozhnostatus
Сообщений: 8 575
Спасибо сказали: 15969 раз




Обычно младшая часть в начальных ячейках, а старшая - в ячейках с бОльшим адресом.
Был бы ты сишник, а не паскалист - "послал" бы тебя по разным источникам. Например, http://algolist.manual.ru/maths/longnum.php


--------------------
- Да ну!?
- Horn of the Argali гну!


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
FBX
сообщение 13 Apr 2010, 21:01
Сообщение #3

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




Цитата
var a,b,c: TDigit;


ab mod c = ?

cray.gif

для "Монтгомери" нужно сначала произвести деление...


--------------------
using namespace fbx;
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 13 Apr 2010, 21:26
Сообщение #4

Etoslozhnostatus
Сообщений: 8 575
Спасибо сказали: 15969 раз




Можно поконкретнее описать, что нужно? И большая ли степень b? TDigit - целое число? Модуль c имеет какие-то особенности, например c=2N или c=2N+1?

Добавлено ([mergetime]1271183161[/mergetime]):
С Монтгомери плохо знаком.


--------------------
- Да ну!?
- Horn of the Argali гну!
Go to the top of the pageAdd Nick
 
+Quote Post
FBX
сообщение 13 Apr 2010, 21:33
Сообщение #5

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




Так вот я описал что нужно найти. Куда это вставляется сам точно не знаю. TDigit объявлен в первом посте, все три числа произвольные.


--------------------
using namespace fbx;
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 13 Apr 2010, 21:41
Сообщение #6

Etoslozhnostatus
Сообщений: 8 575
Спасибо сказали: 15969 раз




Всё равно не очень понятно.

Вариант: тупо умножать x="a" на "a" b-1 раз, а потом вычислить остаток от деления на "c".


--------------------
- Да ну!?
- Horn of the Argali гну!
Go to the top of the pageAdd Nick
 
+Quote Post
FBX
сообщение 13 Apr 2010, 21:48
Сообщение #7

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




В том-то и дело, что это не вариант smile.gif степень - число до 2048 бит, аргумент - тоже. Даже если бы они были по 32 бит, никакой памяти бы не хватило на хранение результата возведения в степень, да и сколько времени это бы длилось...

А вот статьи, в которых не понял смысла некоторых выражений и обозначений (похоже на опечатки, но кто знает):

Деление: http://naukoved.ru/content/view/1300/45/

Монтгомери: http://dic.academic.ru/dic.nsf/ruwiki/1277680
http://naukoved.ru/content/view/1301/45/


--------------------
using namespace fbx;
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 13 Apr 2010, 21:51
Сообщение #8

Etoslozhnostatus
Сообщений: 8 575
Спасибо сказали: 15969 раз




Есть вариант для такого случая: после каждого умножения находить остаток от деления на "c" и потом умножать уже на него.


--------------------
- Да ну!?
- Horn of the Argali гну!
Go to the top of the pageAdd Nick
 
+Quote Post
FBX
сообщение 13 Apr 2010, 22:08
Сообщение #9

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




не, количество итераций умножения / деления все равно будет слишком большим.


--------------------
using namespace fbx;
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 13 Apr 2010, 22:23
Сообщение #10

Etoslozhnostatus
Сообщений: 8 575
Спасибо сказали: 15969 раз




Есть алгоритмы, оптимизирующие количество умножений при возведении в степень.
Например: x^16 - 15 умножений?
A = x*x = x^2; B = A*A = x^4; C = B*B = x^8; D = C*C = x^16. То есть 4 умножения. Для x^31 придётся выполнить, кажется, 7 умножений. В среднем 2*log2b умножений.
После каждого умножения находим остаток и потом используем его.


--------------------
- Да ну!?
- Horn of the Argali гну!


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 14 Apr 2010, 07:47 (Сообщение отредактировал gamecreator - 14 Apr 2010, 07:47)
Сообщение #11

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




Цитата(FBX @ 13 Apr 2010, 22:48)

насколько я понял, это алгоритм компьютерного деления.

еще вариант:
( a * b ) mod c = ( ( a mod c ) * ( b mod c ) ) mod c
в твоем варианте:
( a ^ b ) mod c = ( ( a mod c ) ^ b ) mod c
Go to the top of the pageAdd Nick
 
+Quote Post
FBX
сообщение 03 May 2010, 21:50
Сообщение #12

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




Пришлось использовать для хранения чисел string, причем в читабельной десятичной форме. Сел сегодня, что-то сваял, для размера основания, степени и делителя по ~2048 бит программа работала 85 секунд. Если ~512 бит, то 1.5 секунд. Монтгомери ниасилил, поэтому сделал по-тупому.
Всем еще раз спасибо за помощь.


--------------------
using namespace fbx;
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 04 May 2010, 15:58 (Сообщение отредактировал hippocamus - 04 May 2010, 16:01)
Сообщение #13

допустим, мяў
Сообщений: 24 070
Спасибо сказали: 13377 раз




возведение в целую степень. быстрый алгоритм.
Код
function Power (A, B: Int64): Int64; {или LongInt?}
begin
  Result := 1;
  while (B > 0) do
     begin
         if (B and 1 = 1) then Result := Result * A;
         A := A + A;
         B := B shr 1;
     end;
end;


Или вот, в общем случае:
Код
function Power (A, B: Double): Double;
begin
 if (A < 0) then Result := -1 * Exp(B * Ln(Abs(A)))
 else if (A > 0) then Result := Exp(B * Ln(Abs(A)))
 else Result := 0;
 if (Round(B) mod 2 = 0) then Result :=Abs(Result);
 if (B = 0) then Result := 1;
end;


--------------------
Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская)
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 04 May 2010, 15:59
Сообщение #14

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




а что такое х?
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 04 May 2010, 16:01
Сообщение #15

допустим, мяў
Сообщений: 24 070
Спасибо сказали: 13377 раз




исправил.


--------------------
Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская)
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 04 May 2010, 16:25
Сообщение #16

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




xai=0(x-ki)ai где
aєR
ai=[a'i]
a'0=a
a'i={a'i-1}*k

Добавлено ([mergetime]1272979500[/mergetime]):
Пi=0 - имеется ввиду произведение от 0 до бесконечности
Go to the top of the pageAdd Nick
 
+Quote Post
Дьяк
сообщение 04 May 2010, 17:59
Сообщение #17

Member
Сообщений: 97
Спасибо сказали: 80 раз




не умничай ))
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 04 May 2010, 18:30
Сообщение #18

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




дык это способ.

Добавлено ([mergetime]1272987048[/mergetime]):
можно еще в ряд Тейлора раскладывать в окрестности 1
Go to the top of the pageAdd Nick
 
+Quote Post
FBX
сообщение 10 May 2010, 12:51
Сообщение #19

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




Как реализовать расширенный алгоритм Евклида
( http://www.cyberguru.ru/cpp-sources/algori...tm-evklida.html )

да так, чтобы Y получился гарантированно отрицательный, а X - положительный.

(точнее, оба они получились положительные в формуле ax - by = НОД)


--------------------
using namespace fbx;
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 10 May 2010, 13:49 (Сообщение отредактировал gamecreator - 10 May 2010, 13:45)
Сообщение #20

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




а никак. поменять a и b местами. и алгоритмы там кривые.
GCD(a,cool.gifhuh.gifb==0)?a:GCD(b,a mod cool.gif.
bx+(a mod cool.gify=ay+b(x-[a/b]y)

Добавлено ([mergetime]1273488582[/mergetime]):
код на с++
Код
int gcd(int a,int b,int &x,int &y)
{
   if(!b)
   {
       x=1;
       y=0;
       return a;
   }
   int res;
   res=gcd(b,a%b,y,x);
   y-=(a/b)*x;
   return res;
}
Go to the top of the pageAdd Nick
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 14 August 2025 - 14:27
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика