Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Длинная арифметика,случайное число

Автор: Let 5.01.2008 1:32

Ищу простое число по малой теореме Ферма.Там мне необходимо случайное число от 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;
begin
repeat
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 := 1 to 3 do 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?А как тогда быть с большим числом,вводимым с клавиатуры?
Или я не правильно разобрался в работе самого модуля? unsure.gif

Автор: volvo 6.01.2008 22:59

Цитата
А как тогда быть с большим числом, вводимым с клавиатуры?

Ну, в принципе модуль не был изначально предназначен для ввода чисел, больших, чем MaxLongInt, но никто ж не мешает добавить еще один конструктор smile.gif :

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 <> 0 do 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, но никто ж не мешает добавить еще один конструктор smile.gif :

Никто не мешает smile.gif Уже добавил сам.Еще раз спасибо за сам модуль и за генератор чисел!