|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
почему выдает ошибку: Operator not applicable to this operand type?
почему выдает ошибку: Operator not applicable to this operand type?
Код:
procedure TForm1.Button2Click(Sender: TObject); var P,G,X,K,M,a,b,Y:integer; begin P:=strtoint(Edit1.Text); G:=strtoint(Edit2.Text); X:=strtoint(Edit3.Text); K:=strtoint(Edit5.Text); if ((P>G)and(X<P))and((K<(P-1))and(K>1)) then begin Y:=exp(X*ln(G)) mod P; // на этой строке ошибка! Edit4.Text:=inttostr(Y); end else messagebox(0, pchar('Вы ввели значения неправильно! P>G, X<P и 1<K<P-1'),pchar('ВНИМАНИЕ!'),mb_iconinformation+mb_ok); end; всю голову сломала, все типы данных перепробовала! что-то не так с mod скорее всего... |
#2
|
||||
|
||||
Правильно:
Код:
integer mod integer Код:
real mod integer Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
||||
|
||||
Все очень просто mod это остаток от деления целого числа на целое...т.е. (как у тебя) integer на integer...
Код:
exp(X*ln(G)) Что конкретно ты хочешь сделать??? В начале был Бит, потом Байт и только потом появилось Слово... |
#4
|
|||
|
|||
у меня просто формула:
Y:=G(в степени х) mod P по идее там не должно быть дробного числа... но т.к. там экспонента и логарифм, то дробное скорее всего появится... а вообще в целом пытаюсь рализовать шифр Эль Гамаля... но это только начало |
#5
|
||||
|
||||
Дело не в том появится или нет, а в том, что Exp по определению всегда возвращает Real. И даже если она вернет вроде-бы целое число, все равно для дельфи это будет реал, а он очень строго следит за соответствием типов при операциях типа вашей.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
||||
|
||||
превратить из дробного в целое поможет функция Trunc(ваше дробное)...
В начале был Бит, потом Байт и только потом появилось Слово... |
#7
|
|||
|
|||
ага, спасибо!
|
#8
|
|||
|
|||
а может кто делал такой шифр?
у меня что-то с дешифрацией не так... не правильно дешифрует Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; Button2: TButton; Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit4: TEdit; Edit5: TEdit; Button3: TButton; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var P,G,X,K,M,a,b,Y,Mm:cardinal; Form1: TForm1; implementation {$R *.dfm} function get_random(in_v: integer; a0,m : integer) : integer overload; begin get_random := (a0 * in_v) mod (m); end; function Nod(z1,z2:integer):integer; begin while (z1<>0)and(z2<>0) do if z1>z2 then z1:=z1 mod z2 else z2:=z2 mod z1; if z1=0 then result:=z2 else result:=z1; end; procedure TForm1.Button2Click(Sender: TObject); var nodel:integer; begin randomize; P:=get_random (random(100), 6789, 123); repeat G:=get_random (random(50), 6789, 123); until (P>G)and(G<>0); //G:= 1 mod P; nodel:=0; repeat X:=get_random (random(10), 678, 123); nodel:=Nod((P-1),X); until (nodel=1)and(X<P); nodel:=0; repeat K:=get_random (random(10), 678, 123); nodel:=Nod((P-1),K); until (nodel=1)and(K>1)and(K<(P-1)); Edit1.Text:=inttostr(P); Edit2.Text:=inttostr(G); Edit3.Text:=inttostr(X); Edit5.Text:=inttostr(K); if ((P>G)and(X<P))and((K<(P-1))and(K>1)) then begin Y:=(Round(exp(X*ln(G)))) mod P; Edit4.Text:=inttostr(Y); end else messagebox(0, pchar('Вы ввели значения неправильно! P>G, X<P и 1<K<P-1'),pchar('ВНИМАНИЕ!'),mb_iconinformation+mb_ok); end; procedure TForm1.Button1Click(Sender: TObject); begin if Memo1.Lines.Text<>'' then begin Memo2.Clear; Memo3.Clear; M:=strtoint(Memo1.Text); a:=(Round(exp(K*ln(G)))) mod P; b:=(Round((exp(K*ln(Y))*M))) mod P; Memo2.Lines.Add('a='+inttostr(a)); Memo2.Lines.Add('b='+inttostr(b)); Memo2.Lines.Add('('+inttostr(a)+','+inttostr(b)+')'); end else messagebox(0, pchar('Вы не ввели сообщение!'),pchar('ВНИМАНИЕ!'),mb_iconinformation+mb_ok); end; procedure TForm1.Button3Click(Sender: TObject); begin Mm:=(round(exp(-X*ln(a))*b) mod P); Memo3.Lines.Add(inttostr(Mm)); end; end. А какой в Delphi самый большой тип для целых чисел? а то постоянно получается Floating point overflow.. вроде как деления на 0 нет... Последний раз редактировалось Athen, 29.10.2009 в 19:52. |