IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Длинная арифметика,случайное число
Let
сообщение 4.01.2008 21:32
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Ищу простое число по малой теореме Ферма.Там мне необходимо случайное число от 1 до искомого числа.Как реализовать функцию,которая бы выдавала случайное значение длинной арифметики?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.01.2008 21:40
Сообщение #2


Гость






Цитата
Как реализовать функцию,которая бы выдавала случайное значение длинной арифметики?
Можно посмотреть, какая реализация длинной арифметики имеется в виду (их даже на этом форуме есть несколько, не говоря уже о том, что есть вообще в сети), и в каких пределах должно быть значение?
 К началу страницы 
+ Ответить 
Let
сообщение 6.01.2008 13:27
Сообщение #3





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 4.01.2008 21:40) *

Можно посмотреть, какая реализация длинной арифметики имеется в виду (их даже на этом форуме есть несколько, не говоря уже о том, что есть вообще в сети), и в каких пределах должно быть значение?

Использовал модуль который лежит в FAQ:HUGEObJ.pas
А значение от 1 до 10^300.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.01.2008 14:00
Сообщение #4


Гость






Добавляем в 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.


Так пойдет?

Сообщение отредактировано: volvo - 6.01.2008 14:39
 К началу страницы 
+ Ответить 
Let
сообщение 6.01.2008 17:50
Сообщение #5





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 6.01.2008 14:00) *

Так пойдет?

Да.Большое спасибо.Все работает.
ЗЫ:Правда вопрос по самому модулю:Перед тем как выполнять различные операции мы обязательно должны ввести число типа longint?А как тогда быть с большим числом,вводимым с клавиатуры?
Или я не правильно разобрался в работе самого модуля? unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.01.2008 18:59
Сообщение #6


Гость






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

Ну, в принципе модуль не был изначально предназначен для ввода чисел, больших, чем 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 19:58
Сообщение #7





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 6.01.2008 18:59) *

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

Никто не мешает smile.gif Уже добавил сам.Еще раз спасибо за сам модуль и за генератор чисел!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 15:11
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"