1zm.h(3) Library Functions Manual zm.h(3)
2
3
4
6 zm.h - Кольца вычетов целых чисел
7
8
10 #include 'bee2/math/qr.h'
11
12
13 Функции
14 void zmCreatePlain (qr_o *r, const octet mod[], size_t no, void *stack)
15 Создание описания кольца вычетов целых чисел с обычной редукцией
16 void zmCreateCrand (qr_o *r, const octet mod[], size_t no, void *stack)
17 Создание описания кольца вычетов целых чисел с редукцией Крэндалла
18 void zmCreateBarr (qr_o *r, const octet mod[], size_t no, void *stack)
19 Создание описания кольца вычетов целых чисел с редукцией Барретта
20 void zmCreateMont (qr_o *r, const octet mod[], size_t no, void *stack)
21 Создание описания кольца вычетов целых чисел с редукцией Монтгомери
22 void zmCreate (qr_o *r, const octet mod[], size_t no, void *stack)
23 Создание описания кольца вычетов целых чисел
24 void zmMontCreate (qr_o *r, const octet mod[], size_t no, size_t l,
25 void *stack)
26 Создание описания кольца Монтгомери
27 bool_t zmIsValid (const qr_o *r)
28 Описание кольца вычетов целых чисел корректно?
29
31 Реализованы операции в кольце вычетов Zm = Z / (mod), где mod --
32 произвольное натуральное число.
33
34 Элементы кольца кодируются строками из no октетов и задаются массивами
35 из W_OF_O(no) машинных слов, где no -- длина mod в октетах. При
36 кодировании используются порядок 'от младших к старшим'. Перечисленные
37 соглашения можно учитывать при планировании работы с кольцом.
38
39 Для редукции по модулю mod используются функции, объявленные в zz.h:
40
41 • обычная редукция zzRed();
42
43 • редукция Крэндалла zzRedCrand();
44
45 • редукция Барретта zzRedBarr();
46
47 • редукция Монтгомери zzRedMont().
48
49 В кольце с редукцией Монтгомери вместо обычного умножения
50
51 c <- a * b \mod mod
52
53
54 используется специальное умножение
55
56 c <- a * b * R^{-1} \mod mod,
57
58
59 где R -- минимальное число вида B^n, большее mod.
60
61 Мультипликативной единицей в кольце Монтгомери является число R \mod
62 mod, мультипликативно обратный к a элемент: a^{-1} * R^2 \mod mod.
63
64 Число a из обычного кольца вычетов преобразуется в элемент a * R \mod
65 mod кольца Монтгомери. После вычислений в кольце выходной элемент b
66 преобразуется в число b * R^{-1} \mod mod.
67
68 Кольцо, которое создается с помощью функции zmMontCreate(), является
69 'чистым' кольцом Монтгомери. Элементы этого кольца представляются
70 числами 'как есть'. Чистые кольца Монтгомери используются в алгоритмах
71 СТБ 1176.2. В чистом кольце R = 2^l, причем l не обязательно кратно
72 B_PER_W, т.е. R не обязательно имеет вид B^n.
73
74 Прим.
75 Функции zzCreateMont() и zzMontCreate() создают разные кольца.
76
77 Предусловие
78 Все указатели действительны.
79
80 Регулярность
81 todo
82
84 void zmCreate (qr_o * r, const octet mod[], size_t no, void * stack)
85 По модулю [no]mod, представленному строкой октетов, создается описание
86 r кольца Z / (mod). Подбирается оптимальное (с точки зрения
87 эффективности вычислений) описание.
88
89 Предусловие
90 no > 0 && mod[no - 1] > 0.
91
92 Постусловие
93 r->no == no и r->n == W_OF_O(no).
94
95 Прим.
96 Оптимальное кольцо подбирается с учетом следующих результатов
97 экспериментов (2013.09.17):
98
99 • редукция Крэндалла примерно в 2 раза быстрее редукции Монтгомери;
100
101 • редукция Монтгомери примерно в 2 раза быстрее редукции Барретта;
102
103 • редукция Барретта несколько опережает обычную редукцию при r->n
104 >= 4.
105
106 Схема расчета размера состояния r
107 zmCreate_keep(no).
108
109 Схема расчета глубины stack
110 zmCreate_deep(no).
111
112 Аргументы
113 r описание кольца
114 mod модуль
115 no длина mod в октетах
116 stack вспомогательная память
117
118 void zmCreateBarr (qr_o * r, const octet mod[], size_t no, void * stack)
119 По модулю [no]mod, представленному строкой октетов, создается описание
120 r кольца Z / (mod). При вычислениях в кольце используется редукция
121 Барретта.
122
123 Предусловие
124 no > 0 && mod[no - 1] > 0.
125
126 Постусловие
127 r->no == no и r->n == W_OF_O(no).
128
129 Схема расчета размера состояния r
130 zmCreateBarr_keep(no).
131
132 Схема расчета глубины stack
133 zmCreateBarr_deep(no).
134
135 Аргументы
136 r описание кольца
137 mod модуль
138 no длина mod в октетах
139 stack вспомогательная память
140
141 void zmCreateCrand (qr_o * r, const octet mod[], size_t no, void * stack)
142 По модулю [no]mod, представленному строкой октетов, создается описание
143 r кольца Z / (mod). При вычислениях в кольце используется редукция
144 Крэндалла.
145
146 Предусловие
147 no > 0 && mod[no - 1] > 0.
148
149 mod == B^n - c, где n >= 2 && 0 < c < B.
150
151 Постусловие
152 r->no == no и r->n == W_OF_O(no).
153
154 Схема расчета размера состояния r
155 zmCreateCrand_keep(no).
156
157 Схема расчета глубины stack
158 zmCreateCrand_deep(no).
159
160 Аргументы
161 r описание кольца
162 mod модуль
163 no длина mod в октетах
164 stack вспомогательная память
165
166 void zmCreateMont (qr_o * r, const octet mod[], size_t no, void * stack)
167 По модулю [no]mod, представленному строкой октетов, создается описание
168 r кольца Z / (mod). При вычислениях в кольце используется редукция
169 Монтгомери.
170
171 Предусловие
172 no > 0 && mod[no - 1] > 0.
173
174 mod -- нечетное число.
175
176 Постусловие
177 r->no == no и r->n == W_OF_O(no).
178
179 Схема расчета размера состояния r
180 zmCreateMont_keep(no).
181
182 Схема расчета глубины stack
183 zmCreateMont_deep(no).
184
185 Аргументы
186 r описание кольца
187 mod модуль
188 no длина mod в октетах
189 stack вспомогательная память
190
191 void zmCreatePlain (qr_o * r, const octet mod[], size_t no, void * stack)
192 По модулю [no]mod, представленному строкой октетов, создается описание
193 r кольца Z / (mod). При вычислениях в кольце используется обычная
194 редукция.
195
196 Предусловие
197 no > 0 && mod[no - 1] > 0.
198
199 Постусловие
200 r->no == no и r->n == W_OF_O(no).
201
202 Схема расчета размера состояния r
203 zmCreatePlain_keep(no).
204
205 Схема расчета глубины stack
206 zmCreatePlain_deep(no).
207
208 Аргументы
209 r описание кольца
210 mod модуль
211 no длина mod в октетах
212 stack вспомогательная память
213
214 bool_t zmIsValid (const qr_o * r)
215 Проверяется корректность описания r кольца Z / (mod). Проверяются
216 следующие условия:
217
218 • qrIsOperable(r) == TRUE;
219
220 • указатель r->mod корректен;
221
222 • r->mod[r->n - 1] > 0.
223
224 Возвращает
225 Признак корректности.
226
227 Прим.
228 Работоспособность и корректность эквивалентны.
229
230 Аргументы
231 r описание кольца
232
233 void zmMontCreate (qr_o * r, const octet mod[], size_t no, size_t l, void *
234 stack)
235 По модулю [no]mod, представленному строкой октетов, создается описание
236 r кольца Монтгомери c параметром R = 2^l.
237
238 Предусловие
239 no > 0 && mod[no - 1] > 0.
240
241 mod -- нечетное число.
242
243 mod < R && B^n <= R (n -- число слов для размещения mod).
244
245 Прим.
246 Если кольцо построено, то r->no == no и r->n == W_OF_O(no).
247
248 Схема расчета размера состояния r
249 zmMontCreate_keep(no).
250
251 Схема расчета глубины stack
252 zmMontCreate_deep(no).
253
254 Аргументы
255 r описание кольца
256 mod модуль
257 no длина mod в октетах
258 l показатель в параметре R
259 stack вспомогательная память
260
262 Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.
263
264
265
266Библиотека Bee2 Пт 23 Июн 2023 zm.h(3)