Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2011, 01:56   #1
Prony5
 
Регистрация: 30.03.2011
Сообщений: 3
По умолчанию Реализовать работу формулы

Есть формула:

к примеру a=6; x=8; b=9, p=11, M должно получиться 5, как реализовать на паскале?
Prony5 вне форума Ответить с цитированием
Старый 18.10.2011, 09:54   #2
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

m:=(b/exp(x*ln(a)) ) mod p;
Form_13 вне форума Ответить с цитированием
Старый 18.10.2011, 10:08   #3
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
program Prony5;
var b,x,a : double
     m, p : integer;
begin
  writeln('введите a ');read(a);
  writeln('введите b ');read(b);
  writeln('введите x ');read(x);
  writeln('введите x ');read(p);
  далее идёт формуа  Form_13, рекомендую первую часть выражения до mod вставить в функцию Round
  writeln('m = ',m:12:6);
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 18.10.2011, 13:46   #4
Prony5
 
Регистрация: 30.03.2011
Сообщений: 3
По умолчанию

Цитата:
m:=(b/exp(x*ln(a)) ) mod p;
первая часть выражения вещественная...
Цитата:
рекомендую первую часть выражения до mod вставить в функцию Round
тогда м=0, должно быть 5
http://ru.wikipedia.org/wiki/Elgamal

Последний раз редактировалось Prony5; 18.10.2011 в 13:49. Причина: дополнение
Prony5 вне форума Ответить с цитированием
Старый 18.10.2011, 14:24   #5
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Я попробовал повозиться, в итоге выходит, что выражение b*(a^x)^-1 при данных тобою числах имеет значение: 7.9383E-007, то есть очень довольно таки маленькое число, и от него нельзя найти mod p; потому что оно и так дробное. Я посмотрел алгоритм в википедии, может конечно там так и получается, но вот что я придумал:

Код:
program Prony5;
var b,x,a,e1 : real;
     m, p,e2 : integer;
begin
  writeln('введитеa ');read(a);
  writeln('введите b ');read(b);
  writeln('введите  x ');read(x);
  writeln('введите p ');read(p);
  e1:=exp(-x*ln(a));
  writeln('e1 = ',e1:12);
  e1:=e1*b;
  writeln('e1 = ',e1:12);
  e1:=e1*10000000;
  writeln('e1 = ',e1:12);
  e2:=round(e1);
  writeln('e2 = ',e2:12);
  e2:=e2 mod p;
  writeln('e2 = ',e2:12);
end.
В итоге правда получается цифра "8" а не пять, но это опять же таки для твоего конкретного примера. Потому что я домножил число с плавающей точкой на сколько нужно, и нашёл от него целую часть. От неё сделал mod p; други вариантов нету, можно попробовать спросить Папок паскаля. Может ещё получиться "2" при увеличение точности..

Сейчас позовём сюда Отцов)
Form_13 вне форума Ответить с цитированием
Старый 18.10.2011, 16:55   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

у... посмотрел по ссылочкам..
Схема Эль-Гамаля - это серьёзно!

моего мат.аппарата не хватило сообразить, как получается M = 5...

Единственное, что я могу предположить, что вместо b = 9 берётся b с числом разрядов равных числу 6^8...
вот так, например:
Код:
var b,x,a,e1 : extended;
     M, p,e2 : int64;
begin
{  writeln('введите a ');read(a);
  writeln('введите b ');read(b);
  writeln('введите  x ');read(x);
  writeln('введите p ');read(p); }
  a := 6;
  x := 8;
  b := 9;
  p := 11;
  e1:=exp(x*ln(a));
  writeln('e1 = ',e1:0:2);
  e2 := trunc(ln(e1)/ln(10));
  e1:=b*exp(e2*ln(10))/e1;
  writeln('e1 = ',e1:12);
  e2:=trunc(e1);
  writeln('e2 = ',e2:12);
  M := e2 mod p;
  writeln('M = ',M);
  readln
end.
но повторяю - я НЕ РАЗОБРАЛСЯ в алгоритме получения M...
надо ещё будет подумать...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.10.2011, 20:15   #7
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Ссылочка.
Исходя из ссылочки имеем
1679616 * M = 9 (mod 11) (читаем как (1679616 * M) сравнимо с 9 по модулю 11, тут не двойное равно, а тройное должно стоять).

Это означает, что левая и правая части сравнения дают одинаковый остаток при делении на 9.
Правая уже известна - 9 mod 11 = 9
Значит (1679616 * M) mod 11 = 9. Перебирая M получаем значение 5.
Silver_S вне форума Ответить с цитированием
Старый 19.10.2011, 09:59   #8
Prony5
 
Регистрация: 30.03.2011
Сообщений: 3
По умолчанию

Цитата:
Значит (1679616 * M) mod 11 = 9. Перебирая M получаем значение 5.
Спасибо, уже ближе, я в математике не очень силен, кроме перебора не как решить нельзя? Если можно функцию
Prony5 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать работу с файлом death65 Помощь студентам 2 14.02.2011 17:18
Как реализовать подсчет этой формулы? E-Novikov Microsoft Office Excel 14 10.11.2010 23:11
Формулы SunKnight Общие вопросы Delphi 2 07.04.2008 09:38