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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fmod,modf, модули ... 
:(
    Опции темы
SectoR
Дата 14.10.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Посмотрите на рисунок (скриншот Mathcad'а) в прикрепленном файле и
скажите как реализовать на СИ вторую строчку???

С первой проблем нет, если использовать функцию fmod(_,_) из math.h!

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  1.GIF 1,51 Kb
PM   Вверх
SectoR
Дата 14.10.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот алгоритм нахождение обратного элемента по модулю (inverse Euclid), но mod(9/pow(6,8),11) не берет... Может поможете его усовершенствовать smile 
Код

#include<iostream.h>
#include<math.h> // for pow

void extended_euclid(long a, long b, long *x, long *y, long *d)
/* calculates a * *x + b * *y = gcd(a, b) = *d */
{
  long q, r, x1, x2, y1, y2;
  if (b == 0)
  {
    *d = a, *x = 1, *y = 0;
    return;
  }
  x2 = 1, x1 = 0, y2 = 0, y1 = 1;

  while (b > 0)
  {
    q = a / b, r = a - q * b;
    *x = x2 - q * x1, *y = y2 - q * y1;
    a = b, b = r;
    x2 = x1, x1 = *x, y2 = y1, y1 = *y;
  }
  *d = a, *x = x2, *y = y2;
}


long inverse(long a, long n)
/* computes the inverse of a modulo n */
{
  long d, x, y;
  extended_euclid(a, n, &x, &y, &d);
  if (d == 1) return x;
  return 0;
}

int main(void)
{
  long a=9; cout<<a<<endl;
  long n=11;
  cout<<"mod("<<a<<","<<n<<")="<<inverse(a,n)<<endl;

  cin.get();
}


Это сообщение отредактировал(а) SectoR - 14.10.2006, 23:57
PM   Вверх
volvo877
Дата 15.10.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



SectoR, вопрос на засыпку: что ты подразумеваешь под mod(9/pow(6,8),11) ? Это что значит? Словами можно? По модулю 11 понятно. Само число какое?
PM MAIL   Вверх
SectoR
Дата 15.10.2006, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(volvo877 @  15.10.2006,  00:04 Найти цитируемый пост)
что ты подразумеваешь под mod(9/pow(6,8),11)

M=mod( b/pow(a,X), P ) - формула для дешифр-я!

Расшифровываю (зашифрованный по алг-му Эль-Гамаля текст) по формуле M = b/a^(X) mod P
В программе пробовал так:
M=fmod( b/pow(a,X), P ); cout<<"  M: "<<M<<endl;

Пробовал с помощью алг-ма Евклида и его модификации для нахождения обратного элемента по модулю (см. выше)...

9/6^(8)=5.358*10^(-6) - флот получ-ся, а чтобы Euclid и Inverse Euclid алгоритмы работали с float'ами я никак не могу переделать smile 

Проблема все та же, должна пятерка получиться, см. рис:

По какому же алгоритму Mathcad все это дело вычисляет  smile  smile 


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  n.GIF 1,52 Kb
PM   Вверх
volvo877
Дата 15.10.2006, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



Цитата(SectoR @  15.10.2006,  00:12 Найти цитируемый пост)
В программе пробовал так:
M=fmod( b/pow(a,X), P ); cout<<"  M: "<<M<<endl;

Неправильно... Я тебе уже сказал, как нужно делать: Заменяй деление умножением на обратное число по модулю...

Код
M = (b * inverse(pow(a, X), P)) % P;
cout << "M = " << M << endl;


( 9 * inverse(pow(6, 8), 11) % 11 = 5 )
PM MAIL   Вверх
SectoR
Дата 15.10.2006, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вопрос решен, подробности ТУТ!


Буду должен "+", пока не наберу необх-е кол-во постов на этом форуме  smile 

Это сообщение отредактировал(а) SectoR - 15.10.2006, 03:11
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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