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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 22:26   #1
doo
Новичок
Джуниор
 
Регистрация: 22.03.2013
Сообщений: 2
По умолчанию исправление цикла

Как сделать в else чтобы число n генерировалось заново,если числа n и m не простые?
Также новая генерация числа К,если оно не удовлетворяет условию?

Код:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h> 

using namespace std;

//функция проверки на простоту
bool simple (int n) 
{
if(n==1) return 0;
for( int i=2;i<=n/2;i++) if(!(n%i)) return 0;
return 1;
}

//функция возведения в степень
long powmod (long a, long x, long p)
{
long b=1;
while (x>0) {
if (x%2==0) {
x /= 2;
a = (a*a)%p; 
}
else {
x--;
b = (b*a)%p; 
}
}
return b;
}

int main() 
{ 
srand(time(NULL)); 

int n;
int q,p,g;
int m;
int k;
n=0+rand()%10000000;
m=2*n+1;
//генерация простых чисел р и q 
do{
if(simple(n)&&simple(m)) 
{
q=n;
p=m; 
cout<<"q="<<q<<"/n";
cout<<"p="<<p<<"/n";
}
else { printf(" No");
n=0+rand()%10000000;
m=2*n+1;
}
}
while(!simple(n) && !simple(m));
getch();


//генерация g
k=0+rand()%777;
do{
if ((0<k<p-1) && powmod(k,q,p) !=1)
g=k;
else k=0+rand()%777;

}
while((0>=k>=p-1) && powmod(k,q,p) ==1);

//генерация больших случайных чисел

const __int64 A=154017290000,B=954954017290000; 
__int64 Xa=A+rand()%(B);
__int64 Xb=A+rand()%(B);
__int64 Xc=A+rand()%(B);
cout<<"Xa="<<Xa<<"\n"<<"Xb="<<Xb<<"\n"<<"Xc="<<Xc<<"\n";
cout<<endl;

//вычисление открытого параметра Y
__int64 Ya=powmod(g,Xa,p);
__int64 Yb=powmod(g,Xb,p);
__int64 Yc=powmod(g,Xc,p);
cout<<"Ya="<<Ya<<"\n"<<"Yb="<<Yb<<"\n"<<"Yc="<<Yc<<"\n";
cout<<endl;

//связь абонента "a" с "b"
__int64 Zab=powmod(Yb,Xa,p);
__int64 Zba=powmod(Ya,Xb,p);
cout<<"Zab="<<Zab<<"\n"<<"Zba="<<Zba<<"\n";
cout<<endl;

return 0;
system("pause");
}
From Stilet: Это нужно для сохранения здоровья глаз форумчан. Будешь проявлять неуважение к обществу - твои темы оставят без внимания.

Последний раз редактировалось Stilet; 23.03.2013 в 12:41.
doo вне форума Ответить с цитированием
Старый 22.03.2013, 23:09   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Поместите код программы в теги [CODE]
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 23.03.2013, 11:04   #3
doo
Новичок
Джуниор
 
Регистрация: 22.03.2013
Сообщений: 2
По умолчанию

Код:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h> 

using namespace std;

//функция проверки на простоту
bool simple (int n) 
{
if(n==1) return 0;
for( int i=2;i<=n/2;i++) if(!(n%i)) return 0;
return 1;
}

//функция возведения в степень
long powmod (long a, long x, long p)
{
long b=1;
while (x>0) {
if (x%2==0) {
x /= 2;
a = (a*a)%p; 
}
else {
x--;
b = (b*a)%p; 
}
}
return b;
}

int main() 
{ 
srand(time(NULL)); 

int n;
int q,p,g;
int m;
int k;
n=0+rand()%10000000;
m=2*n+1;
//генерация простых чисел р и q 
do{
if(simple(n)&&simple(m)) 
{
q=n;
p=m; 
cout<<"q="<<q<<"/n";
cout<<"p="<<p<<"/n";
}
else { printf(" No");
n=0+rand()%10000000;
m=2*n+1;
}
}
while(!simple(n) && !simple(m));
getch();


//генерация g
k=0+rand()%777;
do{
if ((0<k<p-1) && powmod(k,q,p) !=1)
g=k;
else k=0+rand()%777;

}
while((0>=k>=p-1) && powmod(k,q,p) ==1);

//генерация больших случайных чисел

const __int64 A=154017290000,B=954954017290000; 
__int64 Xa=A+rand()%(B);
__int64 Xb=A+rand()%(B);
__int64 Xc=A+rand()%(B);
cout<<"Xa="<<Xa<<"\n"<<"Xb="<<Xb<<"\n"<<"Xc="<<Xc<<"\n";
cout<<endl;

//вычисление открытого параметра Y
__int64 Ya=powmod(g,Xa,p);
__int64 Yb=powmod(g,Xb,p);
__int64 Yc=powmod(g,Xc,p);
cout<<"Ya="<<Ya<<"\n"<<"Yb="<<Yb<<"\n"<<"Yc="<<Yc<<"\n";
cout<<endl;

//связь абонента "a" с "b"
__int64 Zab=powmod(Yb,Xa,p);
__int64 Zba=powmod(Ya,Xb,p);
cout<<"Zab="<<Zab<<"\n"<<"Zba="<<Zba<<"\n";
cout<<endl;

return 0;
system("pause");
}

Последний раз редактировалось doo; 24.03.2013 в 10:31.
doo вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритмы нахождения эйлерова цикла и гамильтонова цикла в графе. Necare Помощь студентам 0 15.11.2011 18:26
исправление ошибок toldo Microsoft Office Word 2 09.01.2011 15:22
Исправление Behold Фриланс 5 10.09.2009 13:32
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10