Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться в коде! 
V
    Опции темы
THandle
Дата 27.4.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Цитата(CppDevelopeR @  27.4.2008,  22:04 Найти цитируемый пост)
но разве там не procedure, а function? Интересно, интересно...


В Паскале/Делфи есть и процедуры и функции.
Функции возвращают некоторое значение, а процедуры нет.


PM   Вверх
opjox
Дата 27.4.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 1
Всего: 14



Цитата(SashaOSC @  27.4.2008,  17:59 Найти цитируемый пост)
Помогите портировать функцию из C в Delphi пожалуйста!


В коде на Си есть ошибка – зацикливание, т.к. u не изменяется (результат u>>1 никуда не записывается). Если я правильно понял, как надо правильно было это пофиксить, то:

Код

unsigned long qe2(unsigned long x, unsigned long y, unsigned long n) 
{
  unsigned long s=1;
  while(y) {
    if(y&1) s = (s*x) % n;
    y >>= 1;
    x = (x*x) % n;
  }
  return s;
}


Код

function qe2(x, y, n: cardinal): cardinal;
begin
  result := 1;
  while y<>0 do begin
    if(y and 1)<>0 then result := (result*x) mod n;
    y := y shr 1;
    x := (x*x) mod n;
  end;
end;


Цитата(CppDevelopeR @  27.4.2008,  21:04 Найти цитируемый пост)
это должно быть в специальном разделе "Delphi, Kylix, Pascal".

Какая разница? В том разделе меньше людей которые знают Си, в этом Pascal. 
PM MAIL ICQ   Вверх
mes
Дата 27.4.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(MAKCim @  27.4.2008,  17:49 Найти цитируемый пост)
u >> 1

сорри..недоглядел..исправлю

Добавлено через 4 минуты и 44 секунды
Цитата(opjox @  27.4.2008,  23:07 Найти цитируемый пост)
Какая разница? В том разделе меньше людей которые знают Си, в этом Pascal.

прочитать легче, чем написать 
то есть намного вероятнее что правильно переведет тебе прогу в паскаль человек который слегка знает с++(так как ему надо лишь понять условие)
чем тот который слегка знает паскаль (ведь ему надо построить правильный код).  smile 


--------------------
PM MAIL WWW   Вверх
SashaOSC
Дата 28.4.2008, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



На самом деле это реализация алгоритма цепочки сложений, или метода двоичных квадратов и умножения:
rez=x^y mod n
(например, rez=23^25 mod 45=23, ни один тип данных такие числа не вмещает)
Только этот код работает совершенно неправильно!
У меня нет возможности проверить оригинал на Си, может кто-нибудь проверит?
Результат проверять на виндозном калькуляторе инженерного вида.
PM MAIL   Вверх
SashaOSC
Дата 28.4.2008, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



Есть альтернативный алгоритм с рекурсией,но он тоже не работает :(

unsigned long fast_exp (unsigned long x, unsigned long y, unsigned long n) {
unsigned long tmp;
  If (y==1) return(x%n);
  If (1^(x&1)) {
      tmp=fast_exp(x,y/2,n);
      return ((tmp*tmp) % n);}
  Else {
      tmp=fast_exp(x,(y-1)/2,n);
      tmp=(tmp*tmp) % n;
      tmp=(tmp*x) % n;
      return (tmp);
  }
}

PM MAIL   Вверх
xvr
Дата 28.4.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(SashaOSC @ 28.4.2008,  06:57)
На самом деле это реализация алгоритма цепочки сложений, или метода двоичных квадратов и умножения:
rez=x^y mod n
(например, rez=23^25 mod 45=23, ни один тип данных такие числа не вмещает)
Только этот код работает совершенно неправильно!
У меня нет возможности проверить оригинал на Си, может кто-нибудь проверит?

Проверил - работает
Цитата

Результат проверять на виндозном калькуляторе инженерного вида.
А вот ему бы я доверять не стал - промежуточные вычисления делаются в плавающей точке, возможно несовпадение результатов.
(Хотя 23^25 mod 45=23, это тоже проверил)

PM MAIL   Вверх
SashaOSC
Дата 28.4.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



Фух, сделал всё таки этот алгоритм на Delphi. Кривовато, зато работает:

function TForm1.CepochkaSlozhenii(x:Cardinal;y:Cardinal;n:Cardinal):Cardinal;
Var
  tmp1,tmp2:Cardinal;
  i:Integer;
Begin
  If y=1 Then CepochkaSlozhenii:=x mod n;
  If y=2 Then CepochkaSlozhenii:=x*x mod n;
  If y=3 Then CepochkaSlozhenii:=x*x*x mod n;
  If y>3 Then
    Begin
      If (y mod 2)=0 Then
        Begin
          tmp1:=(x*x mod n);
          tmp2:=1;
          If Round(y/2)>3 Then
            Begin
              CepochkaSlozhenii:=CepochkaSlozhenii((x*x mod n),Round(y/2),n);
              Exit;
            End;
          For i:=1 To Round(y/2) Do
            Begin
              tmp2:=tmp2*tmp1;
            End;
          CepochkaSlozhenii:=tmp2 mod n;
        End
      Else
        Begin
          tmp1:=(x*x mod n);
          tmp2:=1;
          If Round((y-1)/2)>3 Then
            Begin
              CepochkaSlozhenii:=(CepochkaSlozhenii((x*x mod n),Round((y-1)/2),n)*(x mod n)) mod n;
              Exit;
            End;
          For i:=1 To Round((y-1)/2) Do
            Begin
              tmp2:=tmp2*tmp1;
            End;
          CepochkaSlozhenii:=tmp2*x mod n;
        End;
    End;
End;

Может можно как то оптимизировать?
PM MAIL   Вверх
mes
Дата 28.4.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



см ниже.

Это сообщение отредактировал(а) mes - 28.4.2008, 16:19


--------------------
PM MAIL WWW   Вверх
mes
Дата 28.4.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вроде так :
Код

Var
  tmp1,tmp2:Cardinal;
  i:Integer;
 y2:Cardinal;
Begin
   if y<=3 Then
     Begin
        If y=1 Then CepochkaSlozhenii:=x mod n;
        Else If y=2 Then CepochkaSlozhenii:=x*x mod n;
        Else If y=3 Then CepochkaSlozhenii:=x*x*x mod n;
       EXIT;
     End;
   
    y2 := y SHR 2;
    If (y2>3) Then 
         If (y mod 2)=0 Then      CepochkaSlozhenii:=CepochkaSlozhenii((x*x mod n), y2,n);
         Else                                 CepochkaSlozhenii:=(CepochkaSlozhenii((x*x mod n), y2,n)*(x mod n)) mod n;  
    Else
      Begin
        tmp1:=(x*x mod n);
        tmp2:=1;

         For i:=1 To y2 Do           tmp2:=tmp2*tmp1;
      
         If (y mod 2)=0 Then       CepochkaSlozhenii:=tmp2 mod n;
         Else                                  CepochkaSlozhenii:=tmp2*x mod n;
        End
End



Это сообщение отредактировал(а) mes - 28.4.2008, 16:23


--------------------
PM MAIL WWW   Вверх
SashaOSC
Дата 28.4.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



Вот короткий и 100% рабочий вариант:

function TForm1.CepochkaSlozhenii(x:Cardinal;y:Cardinal;n:Cardinal):Cardinal;
Var
  s,t,u:Cardinal;
Begin
  s:=1;
  t:=x;
  u:=y;
  While u<>0 Do
    Begin
      If (u mod 2)=1 Then
        s:=(s*t) mod n;
      u:=u shr 1;
      t:=(t*t) mod n;
    End;
  CepochkaSlozhenii:=s;
End;

Всем спасибо за помощь, тема закрыта.
PM MAIL   Вверх
MAKCim
Дата 28.4.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



SashaOSC

M
MAKCim
Модератор: Пользуйтесь тегом код!



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1145 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.