Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Введение в криптологию. В 4 частях. Ч.2. Учебное пособие.pdf

21
Положим b = c = 219.
(
383
219
→ –
219
164
).
Шаг 6 (Выход из алгоритма?).
(a ≠ 0) = (164 ≠ 0) = истина. Возврат к шагу 4.
Шаг 4 (Избавление от четности).
Положим t = 0.
(a – четное) = (164 – четное) = истина.
Положим t = t + 1 = 0 + 1 = 1.
Положим a = a / 2 = 164 / 2 = 82.
(a – четное) = (82 – четное) = истина.
Положим t = t + 1 = 1 + 1 = 2.
Положим a = a / 2 = 82 / 2 = 41.
(a – четное) = (41 – четное) = ложь.
(t – нечетное) = (2 – нечетное) = ложь.
Шаг 5 (Квадратичный закон взаимности).
(a (mod 4) = b (mod 4) = 3) = (41 (mod 4) = 219 (mod 4) = 3) = (1 = 3 = 3) = ложь.
Положим c = a = 41.
Положим a = b (mod c) = 219 (mod 41) = 14.
Положим b = c = 41.
(–
219
164
→ –
41
14
).
Шаг 6 (Выход из алгоритма?).
(a ≠ 0) = (14 ≠ 0) = истина. Возврат к шагу 4.
Шаг 4 (Избавление от четности).
Положим t = 0.
(a – четное) = (14 – четное) = истина.
Положим t = t + 1 = 0 + 1 = 1.
Положим a = a / 2 = 14 / 2 = 7.
(a – четное) = (7 – четное) = ложь.
(t – нечетное) = (1 – нечетное) = истина.
(b (mod 8) = 3 или 5) = (41 (mod 8) = 3 или 5) = (1 = 3 или 5) = ложь.

22
Шаг 5 (Квадратичный закон взаимности).
(a (mod 4) = b (mod 4) = 3) = (7 (mod 4) = 41 (mod 4) = 3) = (3 = 1 = 3) = ложь.
Положим c = a = 7.
Положим a = b (mod c) = 41 (mod 7) = 6;
Положим b = c = 7.
(–
41
14
→ –
7
6
).
Шаг 6 (Выход из алгоритма?).
(a ≠ 0) = (6 ≠ 0) = истина. Возврат к шагу 4.
Шаг 4 (Избавление от четности).
Положим t = 0.
(a – четное) = (6 – четное) = истина.
Положим t = t + 1 = 0 + 1 = 1.
Положим a = a / 2 = 6 / 2 = 3.
(a – четное) = (3 – четное) = ложь.
(t – нечетное) = (1 – нечетное) = истина.
(b (mod 8) = 3 или 5) = (7 (mod 8) = 3 или 5) = (7 = 3 или 5) = ложь.
Шаг 5 (Квадратичный закон взаимности).
(a (mod 4) = b (mod 4) = 3) = (3 (mod 4) = 7 (mod 4) = 3) = (3 = 3 = 3) = истина.
Положим r = –r = – (–1) = 1.
Положим c = a = 3.
Положим a = b (mod c) = 7 (mod 3) = 1.
Положим b = c = 3.
(–
7
6
→
3
1
).
Шаг 6 (Выход из алгоритма?).
(a ≠ 0) = (1 ≠ 0) = истина. Возврат к шагу 4.
Шаг 4 (Избавление от четности).
Положим t = 0.
(a – четное) = (1 – четное) = ложь.
(t – нечетное) = (0 – нечетное) = ложь.

23
Шаг 5 (Квадратичный закон взаимности).
(a (mod 4) = b (mod 4) = 3) = (1 (mod 4) = 3 (mod 4) = 3) = (1 = 3 = 3) = ложь.
Положим c = a = 1.
Положим a = b (mod c) = 3 (mod 1) = 0.
Положим b = c = 1.
(
3
1
→
1
0
).
Шаг 6 (Выход из алгоритма?).
(a ≠ 0) = (0 ≠ 0) = ложь. Выход из алгоритма со значением r = 1.
Разработанная программа sJacobi на языке Си, которая реализует алгоритм вычисления значения символа Якоби (и, соответственно, символа Лежандра как его частный случай),
использующий свойство символа Якоби – квадратичный закон взаимности, приведена
на листинге 1.1.
Листинг 1.1. Программа, реализующая алгоритм вычисления значения символа
Якоби (и, соответственно, символа Лежандра как его частный случай), который использует
свойство символа Якоби – квадратичный закон взаимности:
#include <stdio.h> // Описания функций стандартного ввода-вывода
#include <stdlib.h> // Описания стандартных функций
#include <conio.h> // Описания функций консольного ввода-вывода
#include <math.h> // Описания стандартных математических функций
int main()
{
int a, // Первый аргумент символа Якоби
b, // Второй аргумент символа Якоби
r, // Значение символа Якоби
t,
c;
// Прототип функции NOD (наибольший общий делитель)
int NOD(int m, int n);
printf("Введите целое число a\n");
scanf("%d", &a);
L:printf("Введите натуральное, нечетное, большее 1 число b:\n");
scanf("%d", &b);
if(b<=1 || b%2==0) goto L;

24
// Шаг 1. Проверка взаимной простоты
if(a==0)
{
printf("(%d/%d)=0\n", a,b);
getch();
return 0;
}
else
if (NOD(abs(a),b)!=1)
{
printf("(%d/%d)=0\n", a,b);
getch();
return 0;
}
printf("(%d/%d)=", a,b);
// Шаг 2. Инициализация
r=+1;
// Шаг 3. Переход к положительным числам
if (a<0)
{
a=-a;
if (b%4==3) r=-r;
}
// Шаг 4. Избавление от четности
L4:t=0;
while(a%2==0)
{
t=t+1; a=a/2;
}
if(t%2!=0)
if(b%8==3 || b%8==5)
r=-r;
// Шаг 5. Квадратичный закон взаимности
if(a%4==3 && b%4==3)
r=-r;
c=a; a=b%c; b=c;
// Шаг 6. Выход из алгоритма?

25
if(a!=0)
goto L4;
else
{
printf("%+d\n", r);
getch();
return 0;
}
}
// Представление функции NOD (наибольший общий делитель)
int NOD(int m, int n)
{
while(m!=n)
{
if(m>n)
m=m-n;
else
n=n-m;
}
return m;
}
Напомним, что значение символа Лежандра
p
a
говорит о том, является ли a полным
квадратом по модулю простого числа p (можно извлечь квадратный корень из a по модулю
простого числа p) или нет. Символ же Якоби
n
a
не определяет возможность извлечения
квадратного корня из a по модулю составного числа n. Если a действительно является квад-
ратом по модулю n, то символ Якоби будет равен +1. Но из равенства
n
a
= +1 вовсе не сле-
дует, что a является полным квадратом по модулю n.
Разработанная программа square на языке Си, которая проверяет существование квадратного корня из a по модулю простого числа p или по модулю составного числа n, приведена на листинге 1.2.
Листинг 1.2. Программа проверки существования квадратного корня из a по модулю
простого числа p или по модулю составного числа n:

26
#include <stdio.h> // Описания функций стандартного ввода-вывода
int main()
{
long a0; // Изначальный числитель символа Лежандра или Якоби
long a; // Нормализованный числитель символа Лежандра или Якоби
long z; // Знаменатель символа Лежандра или Якоби (p или n)
long y; // Значение символа Лежандра или Якоби
int i; // Претендент на квадратный корень из a
long square_i; // Квадрат претендента на квадратный корень из a
printf("Числитель символа Лежандра или Якоби: ");
scanf("%ld",&a0);
printf("a0 = %ld\n",a0);
printf("Знаменатель символа Лежандра или Якоби: ");
scanf("%ld",&z);
printf("z = %ld\n",z);
// Нормализация числителя символа Лежандра или Якоби
a=a0;
while(a<0)
{
a+=z;
}
while(a>=z)
{
a-=z;
}
printf("Числитель символа Лежандра или Якоби после нормали-
зации) = %ld\n",a);
// Проверка существования квадратного корня из a по модулю z
if (a==0)
{
printf("(%ld/%ld) = 0\n",a0,z);
return 0;
}
else
{

27
i=1;
do
{
square_i=i*i;
while(square_i>z)
{
square_i-=z;
}
i++;
} while ((square_i != a) && (i < z));
if (i != z)
{
printf("(%ld/%ld) = +1\n",a0,z);
}
else
{
printf("(%ld/%ld) = -1\n",a0,z);
}
}
return 0;
}
Результаты использования программ square и sJacobi для установления соответствия
отмеченным выше особенностям символа Лежандра
p
a
и символа Якоби
n
a
по характе-
ризации возможности извлечения квадратного корня из a по модулю простого числа p или
по модулю составного числа n, приведены в табл. 1.68. В ее третьем столбце для символа
Лежандра
p
a
или символа Якоби
n
a
выставлено полученное по программе square:
значение 0, если a делится соответственно на p или на n; значение +1, если существует квадратный корень из a соответственно по модулю p или n; значение минус 1, если квадратный
корень из a соответственно по модулю p или n не существует. В четвертом и пятом столбцах
выставлены значения символов Лежандра
p
a
или символов Якоби
n
a
, полученные соот-
ветственно по расчетным формулам и по программе sJacobi.

28
Таблица 1.68
Символ
Лежандра
p
a
Символ
Якоби
n
a
Существование корня
из a по модулю p или n
по программе square
Значение символа Лежандра
или символа Якоби, полученное
по расчетным
формулам
по программе
sJacobi
(0/7) 0 0 0
(1/7) +1
+1
+1
(2/7) +1
+1
+1
(3/7) –1
–1
–1
(4/7) +1
+1
+1
(5/7) –1
–1
–1
(6/7) –1
–1
–1
(7/3) +1
+1
+1
(2/5) –1
–1
–1
(2/13) –1
–1
–1
(11/3) –1
–1
–1
(3/11) +1
+1
+1
(11/5) +1
+1
+1
(5/11) +1
+1
+1
(15/11) +1
+1
+1
(–1/7) –1
–1
–1
(15/17) +1
+1
+1
(217/221)
+1
+1
+1
(217/13) +1
+1
+1
(3/13) +1
+1
+1
(217/17) +1
+1
+1
(96/221)
–1
+1
+1
(96/13) –1
–1
–1
(96/17) –1
–1
–1
(219/383)
+1
+1
+1

29
Заметим, что, во-первых, полученные значения в четвертом и пятом столбцах таблицы
всегда совпадают, а это говорит об успешном испытании программы sJacobi на конечном
наборе тестов, заданной этой таблицей. Во-вторых, полученные значения в третьем, четвер-
том и пятом столбцах таблицы всегда совпадают, за исключением четвертой снизу строку
для символа Якоби
221
96
. Это как раз пример такого случая, когда символ Якоби
n
a
не определяет возможность извлечения квадратного корня из a по модулю составного
числа n.
Рассмотрим далее более системно вопрос о том, когда символ Якоби
n
a
не опреде-
ляет возможность извлечения квадратного корня из a по модулю числа n.
Пусть n – нечетное число, большее 3. Обозначим через Qn подмножество полных
квадратов в множестве (Z/NZ)* – множестве обратимых в Z/NZ элементов:
*2
)/(|)(mod ZZ nxnxQ
n
. (1.80)
Напомним, что (Z/NZ)* = {x Z/NZ | НОД (x, N) = 1}. Когда N = p – простое число
(Z/NZ)* = (Z/pZ)* = {1, …, p – 1}. Например, для N = 7 множество Z/NZ = {0, 1, …, 6},
а (Z/NZ)* = {1, 2, …, 6}.
Нарастив таблицу квадратов по модулю p = 7 (см. табл. 1.64) столбцами для символа
Якоби
7
x
и корня из x, получим табл. 1.69.
Из этой таблицы видно, что при простом n = 7 по формуле (1.80) имеем:
*2
)/(|)(mod ZZ nxnxQ
n
=
}6,,2,1{|)7(mod
2
7
xxQ
= {1, 2, 4}.
Пусть при нечетном n, большем 3, Jn обозначает подмножество элементов в (Z/nZ)*,
чей символ Якоби равен +1:
1)/(
*
n
x
nxJ
n
ZZ
. (1.81)
При простом n = 7 (см. табл. 1.69):
1)/(
*
n
x
nxJ
n
ZZ
=
1
7
}6,,2,1{
7
x
xJ
= {1, 2, 4}.

30
Таблица 1.69
x
x2 (mod 7) = a
Символ Якоби
7
x
x
0 0 0 0 1 1 +1
1, 6 2 4
+1
3, 4
3 2 –1 – 4 2 +1
2, 5 5 4
–1 – 6 1 –1
–
Заметим, что в рассмотренном примере (при n = 7)
}6,,2,1{|)7(mod
2
7
xxQ
= {1, 2, 4} =
1
7
}6,,2,1{
7
x
xJ
= {1, 2, 4}.
Это подтверждает то, что символ Якоби
n
a
определяет возможность извлечения
квадратного корня из a по простому модулю n.
Пусть теперь n будет составным числом.
Определим множества Qn и Jn для составного числа n = p ∙ q при p = 3 и q = 5, т.е. для
составного числа n = 3 ∙ 5 = 15. В этом нам поможет табл. 1.70, в которой символ Якоби
15
x
вычислен как произведение символов Лежандра
3
x
и
5
x
, а также по программе
sJacobi.
Из таблицы следует, что при составном n = 15:
*2
)/(|)(mod ZZ nxnxQ
n
=
}14,,2,1{|)15(mod
2
15
xxQ
= {1, 4, 6, 9, 10},
1)/(
*
n
x
nxJ
n
ZZ
=
1
15
}14,,2,1{
15
x
xJ
= {1, 2, 4, 8}.
Заметим, что множество всех псевдоквадратов, т.е. квадратичных невычетов, чей
символ Якоби равен +1, представляет собой разность Jn \ Qn. В нашем примере (при составном n = 15) множество всех псевдоквадратов
1515
\ QJ
= {1, 2, 4, 8}\{1, 4, 6, 9, 10} = {2, 8}.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
