qr.h - Man Page

Кольца вычетов

Synopsis

#include 'bee2/defs.h'
#include 'bee2/core/obj.h'

Классы

struct qr_o
Описание кольца вычетов

Определения типов

typedef bool_t(* qr_from_i) (word b[], const octet a[], const struct qr_o *r, void *stack)
Импорт элемента кольца вычетов
typedef void(* qr_to_i) (octet b[], const word a[], const struct qr_o *r, void *stack)
Экспорт элемента кольца вычетов
typedef void(* qr_add_i) (word c[], const word a[], const word b[], const struct qr_o *r)
Сложение в кольце вычетов
typedef void(* qr_sub_i) (word c[], const word a[], const word b[], const struct qr_o *r)
Вычитание в кольце вычетов
typedef void(* qr_neg_i) (word b[], const word a[], const struct qr_o *r)
Аддитивное обращение в кольце вычетов
typedef void(* qr_mul_i) (word c[], const word a[], const word b[], const struct qr_o *r, void *stack)
Умножение в кольце вычетов
typedef void(* qr_sqr_i) (word b[], const word a[], const struct qr_o *r, void *stack)
Возведение в квадрат в кольце вычетов
typedef void(* qr_inv_i) (word b[], const word a[], const struct qr_o *r, void *stack)
Мультипликативное обращение в кольце вычетов
typedef void(* qr_div_i) (word b[], const word divident[], const word a[], const struct qr_o *r, void *stack)
Деление в кольце вычетов
typedef struct qr_o qr_o
Описание кольца вычетов

Функции

bool_t qrIsOperable (const qr_o *r)
Описание кольца вычетов работоспособно?
void qrPower (word c[], const word a[], const word b[], size_t m, const qr_o *r, void *stack)
Возведение в степень в кольце вычетов

Подробное описание

Пусть R -- кольцо, I -- его идеал. Кольцом вычетов называется кольцо R / I, в котором сложение и умножение элементов выполняется по модулю I: (a + I) + (b + I) = (a + b) + I, (a + I) * (b + I) = (a * b) + I.

В интересующих нас случаях кольцо R является коммутативным, а идеал I -- главным, т.е. порожденным единственным элементом mod ∈ R: I = (mod) = {mod * a: a ∈ R}. В этих случаях приведение по модулю I состоит в редукции (определении вычета) по модулю mod.

Кольцо вычетов описывается структурой типа qr_o.

Структура qr_o проектировалась с прицелом на поддержку следующих колец:

В этих кольцах может применяться умножение Монтгомери, умножение в нормальном базисе и другие ускоренные мультипликативные операции. Особенные операции требуют особенного описания кольца и особенного представления его элементов. В связи с этим вводится структура qr_o, которая задает:

Идеал I описывается модулем mod. Для ускорения редукции по модулю mod могут использоваться параметры params. Параметры params могут рассчитываться по mod при создании кольца, могут дублировать mod, или заменять его. Параметры params имеют самостоятельное значение и могут использоваться не только для редукции.

Элемент кольца представляется массивом из n машинных слов. Размерность n определяется при построении кольца и сохраняется в его описании.

Нулевому элементу всегда соответствует нулевой массив.

Мультипликативные единицы могут отличаться. Мультипликативная единица unity инициализируется при построении кольца.

Размерность модуля mod жестко не регламентируется. Эта размерность определяется в функциях работы с элементами кольца по params и (или) n. В кольцах чисел mod задается n словами. Если mod = 2^{B_PER_W * (n - 1)}, то последнее слово mod равняется 1, а последние слова элементов поля всегда равняются 0. В кольцах многочленов mod задается n или n + 1 словом (в зависимости от выполнения равенства deg(mod) == B_PER_W * n).

Элементы кольца экспортируются в строки октетов и импортируются из этих строк. Длина строки no определяется при построении кольца и сохраняется в его описании. Для экспорта / импорта элементов кольца используются функции типов qr_to_i, qr_from_i. Способ определения длины строки указывается при описании колец конкретных типов. Нулевому элементу обязательно соответствует нулевая строка.

Аддитивные операции в кольце, как правило, не меняются при различных его описаниях. Тем не менее, в структуру qr_o включены функции интерфейсов qr_add_i, qr_sub_i и qr_neg_i, которые определяют аддитивные операции.

Мультипликативные операции в кольце задаются интерфейсами qr_mul_i и qr_sqr_i.

Некоторые элементы кольца допускают мультипликативное обращение и, следовательно, определенные пары элементов можно делить друг на друга. Обращение и деление поддерживается интерфейсами qr_inv_i, qr_div_i.

Описание кольца организовано как объект, и можно применять функции, описанные в заголовочном файле obj.h.

Кольцо должно создаваться специальной функцией qrCreate(), которая является аналогом конструктора. В эту функцию должен передаваться указатель r на структуру типа qr_o. По этому указателю будет размещаться описание (состояние) кольца. По адресу r может быть зарезервировано больше памяти, чем sizeof(qr_o). Дело в том, что значения mod, unity, params могут размещаться в поле descr открытого размера. Функция qrCreate() должна сопровождаться функцией qrCreate_keep(), которая поддерживает расчет длины состояния (в октетах).

Функция qrCreate_keep() должна оценивать длину состояния сверху. Оценка может быть неточной. Точная длина состояния фиксируется при непосредственном выполнении qrCreate() и сохраняется в поле keep описания кольца.

В функцию qrCreate() должен передаваться указатель на память для стека. Функция qrCreate() должна сопровождаться функцией qrCreate_deep(), которая выполняет расчет глубины стека. При расчете глубины следует предполагать, что в qrCreate() явно или неявно вызываются все функции кольца. Получив результат работы qrCreate_deep(), внешние программы могут определить, сколько вспомогательной памяти потребуется при всевозможных способах работы с кольцом.

В описании qrCreate() должны быть даны оценки сверху для размерностей n и no. Эти оценки могут использоваться высокоуровневыми функциями при подготовке памяти для размещения элементов кольца.

Оценка глубины стека, определяемая функцией qrCreate_deep(), может быть неточной. Точная глубина фиксируется при непосредственном выполнении qrCreate() и сохраняется в поле deep описания кольца.

Предусловие

Все указатели действительны.

Буферы элементов кольца или их кодовых представлений не пересекаются с буферами, поддерживающими описание кольца.

Предупреждения

В интерфейсах мультипликативных функций не предполагается, что буфер результата либо не пересекается, либо совпадает с буферами входных элементов.

Регулярность

todo

Типы

typedef void(* qr_add_i) (word c[], const word a[], const word b[], const struct qr_o *r)

Определяется сумма [r->n]c элементов [r->n]a и [r->n]b кольца вычетов r:

c <- a + b.

Предусловие

Описание кольца r работоспособно.

Буфер c либо не пересекается, либо совпадает с каждым из буферов a, b.

Элементы a и b принадлежат r.

Ожидается

Описание кольца r корректно.

Аргументы

c сумма  
a первое слагаемое  
b второе слагаемое  
r описание кольца

typedef void(* qr_div_i) (word b[], const word divident[], const word a[], const struct qr_o *r, void *stack)

Определяется частное [r->n]b от деления элемента [r->n]divident на элемент [r->n]a в кольце вычетов r:

b <- divident * a^{-1}.

Предусловие

Описание кольца r работоспособно.

Элементы divident и a принадлежат r.

Ожидается

Описание кольца r корректно.

Ожидается

Элемент a обратим. Если a не обратим, то b может быть любым.

Аргументы

b частное  
divident делимое  
a делитель  
r описание кольца  
stack вспомогательная память

typedef bool_t(* qr_from_i) (word b[], const octet a[], const struct qr_o *r, void *stack)

По кодовому представлению [r->no]a строится элемент [r->n]b кольца вычетов r.

Предусловие

Описание кольца r работоспособно.

Буферы a и b либо не пересекаются, либо указатели a и b совпадают.

Ожидается

Описание кольца r корректно.

Возвращает

TRUE, если кодовое представление корректно и импорт успешно выполнен, и FALSE в противном случае.

Аргументы

b элемент кольца  
a кодовое представление элемента кольца  
r описание кольца  
stack вспомогательная память

typedef void(* qr_inv_i) (word b[], const word a[], const struct qr_o *r, void *stack)

Определяется элемент [r->n]b кольца r, мультипликативно обратный к элементу [r->n]a:

b <- a^{-1}.

Предусловие

Описание кольца r работоспособно.

Элемент a принадлежит r.

Ожидается

Описание кольца r корректно.

Ожидается

Элемент a обратим. Если a не обратим, то b может быть любым.

Аргументы

b обратный элемент  
a обращаемый элемент  
r описание кольца  
stack вспомогательная память

typedef void(* qr_mul_i) (word c[], const word a[], const word b[], const struct qr_o *r, void *stack)

Определяется произведение [r->n]c элементов [r->n]a и [r->n]b кольца вычетов r:

с <- a * b.

Предусловие

Описание кольца r работоспособно.

Элементы a и b принадлежат r.

Ожидается

Описание кольца r корректно.

Аргументы

c произведение  
a первый множитель  
b второй множитель  
r описание кольца  
stack вспомогательная память

typedef void(* qr_neg_i) (word b[], const word a[], const struct qr_o *r)

Определяется элемент [r->n]b кольца r, аддитивно обратный к [r->n]a:

b <- -a.

Предусловие

Описание кольца r работоспособно.

Буфер b либо не пересекается, либо совпадает с буфером a.

Элемент a принадлежит r.

Ожидается

Описание кольца r корректно.

Аргументы

b обратный элемент  
a обращаемый элемент  
r описание кольца

typedef struct qr_o qr_o

Описывается кольцо вычетов, правила представления его элементов и функции, реализующие операции в кольце.

Прим.

В таблицу указателей описания кольца как объекта входят поля mod, unity, params.

typedef void(* qr_sqr_i) (word b[], const word a[], const struct qr_o *r, void *stack)

Определяется квадрат [r->n]b элемента [r->n]a кольца r:

с <- a * a.

Предусловие

Описание кольца r работоспособно.

Элемент a принадлежит r.

Ожидается

Описание кольца r корректно.

Аргументы

b квадрат  
a множитель  
r описание кольца  
stack вспомогательная память

typedef void(* qr_sub_i) (word c[], const word a[], const word b[], const struct qr_o *r)

Определяется разность [r->n]c элементов [r->n]a и [r->n]b кольца вычетов r:

c <- a - b.

Предусловие

Описание кольца r работоспособно.

Буфер c либо не пересекается, либо совпадает с каждым из буферов a, b.

Элементы a и b принадлежат r.

Ожидается

Описание кольца r корректно.

Аргументы

c разность  
a уменьшаемое  
b вычитаемое  
r описание кольца

typedef void(* qr_to_i) (octet b[], const word a[], const struct qr_o *r, void *stack)

Строится кодовое представление [r->no]b элемента [r->n]a кольца вычетов r.

Предусловие

Описание кольца r работоспособно.

Буферы a и b либо не пересекаются, либо указатели a и b совпадают.

Ожидается

Описание кольца r корректно.

Аргументы

b кодовое представление элемента кольца  
a элемент кольца  
r описание кольца  
stack вспомогательная память

Функции

bool_t qrIsOperable (const qr_o * r)

Проверяется работоспособность описания r кольца вычетов. Проверяются следующие условия:

  • объект r работоспособен;
  • objKeep(r) >= sizeof(qr_o);
  • objPCount(r) == 3 && objOCount(r) == 0;
  • указатель r->unity корректен;
  • r->n > 0 && r->no > 0;
  • указатели r->from, r->to, ..., r->div корректны.

Возвращает

Признак работоспособности.

Аргументы

r описание кольца

void qrPower (word c[], const word a[], const word b[], size_t m, const qr_o * r, void * stack)

В кольце вычетов r определяется элемент [r->n]c, который является [m]b-ой степенью элемента [r->n]a:

c <- a^b.

Предусловие

Описание кольца r работоспособно.

Элемент a принадлежит r.

Ожидается

Описание кольца r корректно.

Прим.

При b == 0 возвращается r->unity.

Схема расчета глубины stack

qrPower_deep(r->n, m, r->deep).

Аргументы

c степень  
a основание  
b показатель  
m длина b в машинных словах  
r описание кольца  
stack вспомогательная память

Автор

Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.

Info

Вт 23 Янв 2024 00:00:00 Библиотека Bee2