Ищу простое число по малой теореме Ферма.Там мне необходимо случайное число от 1 до искомого числа.Как реализовать функцию,которая бы выдавала случайное значение длинной арифметики?
volvo
5.01.2008 1:40
Цитата
Как реализовать функцию,которая бы выдавала случайное значение длинной арифметики?
Можно посмотреть, какая реализация длинной арифметики имеется в виду (их даже на этом форуме есть несколько, не говоря уже о том, что есть вообще в сети), и в каких пределах должно быть значение?
Let
6.01.2008 17:27
Цитата(volvo @ 4.01.2008 21:40)
Можно посмотреть, какая реализация длинной арифметики имеется в виду (их даже на этом форуме есть несколько, не говоря уже о том, что есть вообще в сети), и в каких пределах должно быть значение?
Использовал модуль который лежит в FAQ:HUGEObJ.pas А значение от 1 до 10^300.
volvo
6.01.2008 18:00
Добавляем в TLargeInt еще один конструктор:
Constructor TLargeInt.Random(min, max: TLargeInt);
var
i, len: integer;
X: longint;
beginrepeat
FillChar(_me, sizeof(_me), 0);
{ Возможная длина случайного числа - от длина min до длины max }
len := min.getlen + system.random(max.getlen - min.getlen);
i := 0;
repeat
inc(i); Put(i, system.random(base)); { Добавляем Len случайных чисел }until i > len;
SetLen(len); { Устанавливаем длину числа }{ Выполнять, пока сгенерированное число не будет внутри заданного интервала }until (Cmp(min) > 0) and (Cmp(max) < 0);
end;
Вызывать как-то вот так:
uses hugeobj;
var
f: tlargeint;
min, max: tlargeint;
i: integer;
begin
randomize;
{ инициализируем min и max}
min.init(1);
max.init(1); for i := 1to3do max.muldigit(10); { <-- для теста, max = 1000 }{ печатаем границы интервала }
min.print(output); writeln;
max.print(output); writeln;
{ и генерируем случайное число в этом интервале }
f.random(min, max);
f.print(output);
end.
Так пойдет?
Let
6.01.2008 21:50
Цитата(volvo @ 6.01.2008 14:00)
Так пойдет?
Да.Большое спасибо.Все работает. ЗЫ:Правда вопрос по самому модулю:Перед тем как выполнять различные операции мы обязательно должны ввести число типа longint?А как тогда быть с большим числом,вводимым с клавиатуры? Или я не правильно разобрался в работе самого модуля?
volvo
6.01.2008 22:59
Цитата
А как тогда быть с большим числом, вводимым с клавиатуры?
Ну, в принципе модуль не был изначально предназначен для ввода чисел, больших, чем MaxLongInt, но никто ж не мешает добавить еще один конструктор :
constructor TLargeInt.Init_s(const s: string);
var
every, i, err: integer;
value: longint;
vs, base_s: string;
begin
str(base - 1, base_s); every := Length(base_s);
FillChar(_me, sizeof(_me), 0); vs := s;
while length(vs) mod every <> 0do vs := '0' + vs;
i := 0;
repeat
val(copy(vs, length(vs) - every + 1, every), value, err);
{ Здесь можно добавить проверку на "нецелочисленное" содержимое строки... }
inc(i); put(i, value);
delete(vs, length(vs) - every + 1, every);
until vs = '';
setlen(i);
end;
и либо инициализировать так:
var s: string;
...
readln(s);
big_int.init_s(s);
...
, либо вообще внести процедуру чтения строки внутрь конструктора, и просто вызывать init_s без параметров... Только вот до 10300 со строкой не получится (только до 10255), но я не думаю, что у кого-то будет желание вводить > 200 символов... Если все же будет, то PChar в помощь, там подобного ограничения нет...
Let
6.01.2008 23:58
Цитата(volvo @ 6.01.2008 18:59)
Ну, в принципе модуль не был изначально предназначен для ввода чисел, больших, чем MaxLongInt, но никто ж не мешает добавить еще один конструктор :
Никто не мешает Уже добавил сам.Еще раз спасибо за сам модуль и за генератор чисел!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.