Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.10.2009, 18:09
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию почему выдает ошибку: 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  
Старый 28.10.2009, 19:02
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Правильно:
Код:
integer mod integer
а у тебя:
Код:
real mod integer
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 28.10.2009, 19:04
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Все очень просто mod это остаток от деления целого числа на целое...т.е. (как у тебя) integer на integer...
Код:
exp(X*ln(G))
не возвращает целого значения, а дробное типа Real...вот и ошибка...
Что конкретно ты хочешь сделать???
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #4  
Старый 29.10.2009, 10:13
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию

у меня просто формула:
Y:=G(в степени х) mod P по идее там не должно быть дробного числа... но т.к. там экспонента и логарифм, то дробное скорее всего появится...

а вообще в целом пытаюсь рализовать шифр Эль Гамаля... но это только начало
Ответить с цитированием
  #5  
Старый 29.10.2009, 10:24
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Дело не в том появится или нет, а в том, что Exp по определению всегда возвращает Real. И даже если она вернет вроде-бы целое число, все равно для дельфи это будет реал, а он очень строго следит за соответствием типов при операциях типа вашей.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 29.10.2009, 10:44
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

превратить из дробного в целое поможет функция Trunc(ваше дробное)...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #7  
Старый 29.10.2009, 11:45
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию

ага, спасибо!
Ответить с цитированием
  #8  
Старый 29.10.2009, 12:32
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию

а может кто делал такой шифр?
у меня что-то с дешифрацией не так... не правильно дешифрует

Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter