![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
SeregaR1Val |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
В принципе реализация алгоритма понятна, проблемы с нахождением первообразного корня по модулю m
http://ru.wikipedia.org/wiki/Первообразный..._(теория_чисел) И понятия не имею как это запрограммировать, если можете, помогите пожалуйста. В методичке есть реализация на C++, а обучение на Delphi, поэтому непонятно вообще ... Реализация Функция powmod() выполняет бинарное возведение в степень по модулю, а функция generator (int p) - находит первообразный корень по простому модулю (факторизация числа здесь осуществлена простейшим алгоритмом за ). Чтобы адаптировать эту функцию для произвольных , достаточно добавить вычисление функции Эйлера в переменной phi. int powmod (int a, int b, int p) { Сообщение отредактировано: SeregaR1Val - 26.04.2010 20:15 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Ну, а что именно непонятно? У тебя ж есть С++ ный код. Дословно это будет выглядеть так (если приведенный тобой код верен, конечно):
function generator(p: Cardinal): Integer; |
SeregaR1Val |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
TList<Integer> не пропускает, исправил на TList of integer ... тоже самое ...
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Блин... Я все время забываю, что не у всех Дельфи 2009/2010... Тогда придется делать через Array of Integer...
|
SeregaR1Val |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Терзают сомнения, что алгоритм описанный в методе то, что должно быть )) Ну да ладно ...
procedure TForm1.Button1Click(Sender: TObject); Функция modes по моей задумке вычисляет выражение Ae mod m Но почему-то ответ почти всегда 0 или еще что-то, но не то, что надо! Подскажите, пожалуйста, в чем ошибка? Сообщение отредактировано: SeregaR1Val - 28.04.2010 17:46 |
Ozzя |
![]()
Сообщение
#6
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: ![]() ![]() ![]() |
var Сообщение отредактировано: Ozzя - 28.04.2010 18:03 |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата Функция modes по моей задумке вычисляет выражение Ae mod m На самом деле она вычисляет (A^2e) mod m, и возвращает 0 только потому что не хватает разрядности. Даже в UInt64 не помещается промежуточный результат вычисления modes(2, 6, {ну_здесь_неважно_что_будет}) |
SeregaR1Val |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Спасибо. теперь работает лучше, помогите пожалуйста еще с одной деталькой этого алгоритма - создание случайного простого числа ...
function TForm1.Arrayes:integer; Сам перебираю, вроде все нормально, а в итоге он находит только одно число - 3 Добавлено через 6 мин. Извините, глупая ошибка была ... нашел! |
SeregaR1Val |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Function TForm1.modes(A,e,m:integer):longint; На практике e - степень, оказывается достаточно большой и как написал volvo не хватает разрядности, а как можно избавиться от этой проблемы? |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата а как можно избавиться от этой проблемы? Вот это:Function TForm1.modes(A, e, m:integer): longint;, если я ничего не путаю, должно возвращать такой же результат, как и функция, приведенная Оззей. Твой код вообще неправильный, я написал почему... |
SeregaR1Val |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
var По идее почти все готово, только не получается выполнить проверку для числа g, которое является первообразным корнем по модулю p... Опять появляются очень большие числа, хотя теперь вроде все нормально .... Справка: Первообразный корень по модулю p, такое число g, что положительное наименьшее число k, для которого разность gk - 1 делится на p (gk сравнимо с 1 по модулю p), совпадает c j(p), где j(p) - число натуральных чисел, меньших p и взаимно простых с p. Например, при p =? 7 П. к. по модулю 7 является число 3. Действительно j(7) = 6; числа 31 - 1 = 2, 32 - 1 = 8, 33 - 1 = 26, 34 - 1 = 80, 35 - 1 = 242 не делятся на 7, лишь 36 - 1 = 728 делится на 7. П. к. существуют, когда p = 2, p = 4, p = ta, p = 2ta (где t - простое нечётное число, a - целое ³1), а для других модулей их нет. Число П. к. в этих случаях равно j[j(p)] (числа, разность которых кратна m, не считаются за различные) |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
function TForm1.Arrayes:integer; // Создает случайное простое число от 3 до 150 ... Еще раз: Randomize должна вызываться ОДИН раз в начале программы, не 2 и не 3 и не больше... Один. |
SeregaR1Val |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Спасибо, стало лучше работать, но g в половине случаев принимает значение '4523261', хотя перебор идет от 2 до p.. Вообще не понятно что за число и откуда оно ...
function TForm1.g(p:integer):longint; |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Ну, а теперь посмотри внимательно на функцию (я не запускаю, мне сейчас негде проверить, Дельфя здесь не установлена, но это видно и без запуска). Если (per mod p) = 0 выполняется - то ты что-то присваиваешь в Result, а если нет? Вот закончился цикл, и ни для одного kaa (чувствую себя Киплингом прямо) это условие не выполнилось, что функция вернет, ты подумал? Мусор она вернет. Что в стеке валялось на том месте, где была создана переменная Result - то и вернется тебе под видом результата...
Либо в самом начале либо в самом конце функции присвой Result-у значение, которое будет возвращаться при невыполнении условия. |
SeregaR1Val |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Спасибо большое! Очень помог!
|
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 11:02 |