Вверх ↑
Этот топик читают: Гость
Ответов: 56
Рейтинг: 2
#1: 2018-11-14 13:32:15 ЛС | профиль | цитата
Здравствуйте. При попытки сложения, умножения, вычисление остатка от деления и т.д., больших чисел, появляется ошибка. Под большими числами, я имею в виду 2^160, 3^210 и т.д. Числа с 50+ знаками. Подскажите пожалуйста, это вообще возможно реализовать на HiAsm? Я не знаю, эта ошибка ограничение HiAsm или Delphi?
карма: 2
На этом форуме, самые умные и добрые люди, всегда помогут! СПАСИБО!
0
vip
#1.1контекстная реклама от партнеров
Ответов: 8886
Рейтинг: 823
#2: 2018-11-14 14:05:48 ЛС | профиль | цитата
NUB, число в формате Real -- восьми байтное число с плавающей точкой располагает чуть более 15 ТОЧНЫХ десятичных цифр. Число в формате Int64 (знаковое целое) чуть более 19 точных цифр. Этим и исчерпывается точные представления.
Для точных больших чисел с 50+ точных знаков надо делать специальные программы (а нужно-ли, кому нужна такая точность )
карма: 19

0
Ответов: 56
Рейтинг: 2
#3: 2018-11-14 14:26:32 ЛС | профиль | цитата
Леонид писал(а):
кому нужна такая точность

Нужна она для криптографических протоколов. Жаль что на HiAsm не получиться. Спасибо за ответ.
карма: 2
На этом форуме, самые умные и добрые люди, всегда помогут! СПАСИБО!
0
Ответов: 4612
Рейтинг: 746
#4: 2018-11-14 15:06:51 ЛС | профиль | цитата
NUB писал(а):
Нужна она для криптографических протоколов.
Ага, я тоже такое искал. Есть библиотека FGInt на Delphi для этого, но никто ещё не портировал для HiAsm. Нужно сделать несколько компонентов для такой математики - арифметика (в т.ч. генерация случайных простых чисел), сравнение (в т.ч. проверка на простоту), конвертация в/из строку/HEX/BIN.
С другой стороны, схема RSA у нас реализована, если надо.

Редактировалось 3 раз(а), последний 2018-11-19 11:51:07
карма: 26

0
Ответов: 8886
Рейтинг: 823
#5: 2018-11-14 16:52:32 ЛС | профиль | цитата
NUB писал(а):
Жаль что на HiAsm не получиться

Леонид писал(а):
надо делать специальные программы
Но они, программы, не так уж и сложны, чем может показаться Вполне реализуемы, особенно для целочисленной арифметики
карма: 19

0
Ответов: 56
Рейтинг: 2
#6: 2018-11-14 21:21:07 ЛС | профиль | цитата
Netspirit, Леонид, спасибо.
карма: 2
На этом форуме, самые умные и добрые люди, всегда помогут! СПАСИБО!
0
Ответов: 196
Рейтинг: 43
#7: 2018-11-15 20:25:11 ЛС | профиль | цитата
Есть вот такой небольшой юнит для Delphi.
http://www.delphisite.ru/faq/rabota-s-ochen-bolshimi-chislami-v-srede-delphi

--- Добавлено в 2018-11-15 20:34:34

Подцепил к Hiasm, вроде даже работает)
http://forum.hiasm.com/getfile/38512

Редактировалось 1 раз(а), последний 2018-11-15 20:34:34
карма: 2

0
Ответов: 56
Рейтинг: 2
#8: 2018-11-16 09:27:37 ЛС | профиль | цитата
halt писал(а):
Подцепил к Hiasm, вроде даже работает

Это то что нужно! Спасибо!
карма: 2
На этом форуме, самые умные и добрые люди, всегда помогут! СПАСИБО!
0
Ответов: 1925
Рейтинг: 172
#9: 2018-11-17 00:26:50 ЛС | профиль | цитата
halt, а вы уверены в отсутствии ошибок в модуле? Я когда-то смотрел подобный модуль (может, даже этот самый) и помню, что были там какие-то ошибки, потом я забросил его и уже не скажу, где конкретно.

Как по мне, так такие вещи надо делать через двоичную арифметику и ассемблер (для быстроты). Всё это, само собой, будет работать в hiasm.
Но сам за такую работу, извините, не возьмусь. По крайней мере, пока.
карма: 9
0
Ответов: 196
Рейтинг: 43
#10: 2018-11-17 21:48:26 ЛС | профиль | цитата
3042, конечно же не в чём я не уверен. Это просто первое что я нашёл на просторах сети))
карма: 2

0
Ответов: 9906
Рейтинг: 351
#11: 2018-11-18 10:05:24 ЛС | профиль | цитата
3042 писал(а):
Я когда-то смотрел подобный модуль (может, даже этот самый) и помню, что были там какие-то ошибки

Прямо скажем, и здесь -- шедевр еще тот...
............
type
TMathArray = array of integer;
............
procedure MultiplyArray(var a1, a2, a: TMathArray);
var i,j:integer;
b:boolean;
begin
// массив результата никто предварительно и не обнулял, как оказывается.
for i := length(a2) - 1 downto 0 do
for j := length(a1) - 1 downto 0 do
a[j + i] := a[j + i] + (a2[i] * a1[j]);
repeat // а вот так подсчитываются переносы :shock:
b := true;
for i := 0 to length(a) - 1 do
if a[i] > 9 then begin
b := false;
try
a[i + 1] := a[i + 1] + 1;
except
setlength(a, length(a) + 1);
a[i + 1] := a[i + 1] + 1;
end;
a[i] := a[i] - 10;
end;
until b;
end;
............
Оказывается, программисту не обязательно уметь умножать в столбик.
Можно писать программы, которые делают то, чего ты сам делать не умеешь.

Редактировалось 5 раз(а), последний 2018-11-18 10:18:31
карма: 9

0
Ответов: 4612
Рейтинг: 746
#12: 2018-11-19 11:48:47 ЛС | профиль | цитата
FGInt - вас спасет.
карма: 26

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)