//Перевірка взаємної простоти двох чіселIsSimple (Int64 a, Int64 b) {v [3]; (a, b, v); (v [0] == (Int64) 1) true;// Числа взаємно прості, якщо НОД=1false;
}
//Інверсія C по модулю PInverse (Int64 c, Int64 p) {v [3]; (p, c, v); (v [2] lt; 0) v [2] + p; v [2 ];
}
//Швидке зведення A в ступінь X по модулю PModPow (Int64 a, Int64 x, Int64 p) {r, b, s;=1;=a;=1L;// Встановлюємо біт в 1-у позицію (b lt; x) {(x amp; b) {// Якщо в поточній позиції стоїть одиниця=(r * s)% p;
}=(s * s)% p; *=2;// Рухаємо біт на наступну позицію
} r;
}
//Ступінь двойкіInt64 pow2 (int t) {x=1; (x lt; lt; t);
}
//Таблиця простих чисел решетом Ератосфена
#define MAXSIEVE 30000//Розмір решета * prime;// Таблиця знайдених чіселprimeLen=0;// Довжина таблиці
//ПросеіваніеSieve () {isPrime [MAXSIEVE]; i, j; (i=0; i lt; MAXSIEVE; i ++) isPrime [i]=true; [0]=isPrime [1]=false; (i= 2; (i * i) lt; MAXSIEVE; i ++) (isPrime [i]) (int j=i * i; j lt; MAXSIEVE; j +=i) [j]=false;
//Переписуємо (i=2; i lt; MAXSIEVE; i ++) (isPrime [i]) primeLen ++;=(int *) calloc (primeLen, sizeof (Int32));=0; (i=2; i lt; MAXSIEVE; i ++) {(isPrime [i]) {[j ++]=i;
}
}
}
//Випадкове непарне число довжиною k бітOddRandom (long k) {i; mask=1, n; -; (i=1; i lt;=k; i ++) |=1 lt; lt; i; (k lt; 16)=rand ();
else=(rand () lt; lt; 16) | rand (); |=1 lt; lt; k; amp;=mask; ((n amp; 1) == 0) n ++; n;
}
//Генерація простого числа розміром 32 біта методом Маурера
//Взято з книги Handbook of Applied Cryptography. Частина 4. Алгоритм 4.62RandomPrime (int k) {(primeLen == 0) Sieve ();// Створюємо таблицю простих чіселp, s; isPrime; (k lt;=20) {// Пошук випадкового простого тривіальним поділом, якщо число k достатньо маленьке {= OddRandom (k);=sqrt (p);=true; (int i=0; i lt; primeLen; i ++) {(prime [i] gt; s) break; ((p% prime [i]) == 0) {= false ;;
};
} (isPrime);
} while (true);
} {// Рекурсивне построеніеc=0.1, r; m=20; B=c * k * k;// Кордон тривіального поділу
//Генеруємо r - випадкове число від k/2 до km біт (k gt; 2 * m) {= rand ()/(double) RAND_MAX;=pow (2.0, s - 1.0);
} while (k - r * k lt;=m);=0.5;
//Обчислюємо просте меншого размераq=RandomPrime (r * k + 1); I=floor (pow2 (k - 1)/(2.0 * k)); R, n, a, b, d; success=false ; (! success) {
//Вибираємо кандидата в прості в інтервалі [I + 1, 2I] (true) {= random (I); (R lt; I) break;
} шифрування віртуальний алгоритм програма=R + I + 1;=2 * q * R + 1;// N - кандидат
//Перевірка тривіальним поділом по межі B (int i=0; i lt; primeLen; i ++) {((n% prime [i]) == 0); (prime [i] gt;=B) { (true) {= random (n - 4) + 2; ((a gt; 1) amp; amp; (a lt; (n - 1))) break;
}=ModPow (a, n - 1, n); (b == 1) {= ModPow (a, 2 * R, n);=GCD (b - 1, n); (d == 1 ) {n;
}
};
}
};
}
} p;
}