Ищу простое число по малой теореме Ферма.Там мне необходимо случайное число от 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?А как тогда быть с большим числом,вводимым с клавиатуры? Или я не правильно разобрался в работе самого модуля?
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 <> 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, но никто ж не мешает добавить еще один конструктор :
Никто не мешает Уже добавил сам.Еще раз спасибо за сам модуль и за генератор чисел!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.