Решить квадратное уравнение в поле вычетов

Квадратное уравнение

Квадратное уравнение ax 2 + bx + c = 0 на C++ лучше всего решать с помощью формулы, содержащей дискриминант:

Разберем пример кода такой программы:

Данная программа учитывает все исходы при решении подобного уравнения.

Похожие записи:

Квадратное уравнение: 8 комментариев

Добрый день! А как быть со случаями, когда а == 0; b == 0 && c > 0; b == 0 && C !=0 и т.д.?

При a == 0 уравнение перестает называться квадратным. Проблемы также возникают, когда, например, пользователь ввел букву вместо числа. Такие случаи называются аномалиями.
Все аномалии рассмотреть нельзя. Если требуется, то можно, например, рассмотреть аномалию a == 0, добавив после 11-й строки:
if (a == 0)
<
cout

«Все аномалии рассмотреть нельзя.»
Сложно с Вами согласиться. Не такая уж это и нетривиальная задача для программиста — решить уравнение ax2 + bx + c = 0 на C++, учтя все возможные варианты а, b, c, в том числе и когда уравнение перестает быть квадратным и другие.
В противном случае код получается не универсальный, а только для некоторых случаев, когда переменные Вас «устраивают».
Согласитесь — это не решение задачи, а нахождение решения для группы частных случаев.

Нельзя. Будет всегда компьютер, бракованный, на котором программа не будет работать. На этом факте основано всё лицензирование программного обеспечения. Бракованный компьютер — тоже совокупность аномалий.

По квадратному уравнению имеет смысл рассматривать аномалии только, если от Вас это требуется в задании. И процесс такой длительный:
1. Рассматриваются случаи, когда пользователь ввел уравнение, не являющееся квадратным.
2. Рассматриваются случаи, когда пользователь ввел a,b,c, не являющиеся числами.
3. Рассматриваются случаи, когда пользователь, не умеет запускать программу, пишется инструкция.
4. Рассматриваются случаи, когда пользователь не умеет читать, пишется инструкция с картинками, часто с голосовым помощником.
5. Это именно программа, поэтому можно также составить инструкцию по компиляции, указать различные версии программы для разных стандартов языка.
.
Это все не моя выдумка, так делают, но только, если это действительно нужно.

Бывает другой случай, например, нужно сдать программу, решающую квадратное уравнение, преподавателю и вот здесь нужно сделать минимум, то, что написано в примере, а дальше, только если преподаватель просит.

Нет. Вы не правы.
Про аномалии — я вообще ничего не говорю. Я говорю только про задачу, которую озвучили Вы: решить ax2 + bx + c = 0. Другими словами — найти все возможные ответы при абсолютно любых значениях а, b и с. Без исключений. Не важно — квадратное будет уравнение или линейное, после того, как мы с консоли введем переменные. В этом весь смысл программирования. Сделать универсальное решение, которое будет работать всегда, при любых значениях переменных (аномалии, когда пользователю оторвало руки и он не может ввести переменные с консоли, истекая кровью, я тоже не рассматриваю).
Глупо, имея инструмент, который позволяет решить задачу, не решать её в любых, без исключения, случаях. А ограничивать себя только удобными случаями и тривиальными. Это не программирование получается, а ерунда какая-то, решение частных случаев. «Сюда — смотри, сюда — не смотри, а здесь — рыбу заворачивали. »
Вот, корявый, конечно, не оптимальный, но работающий во всех случаях код:

#include
#include
using namespace std;

int main() <
double a, b, c;
cin >> a >> b >> c;
/*(D = b*b minus 4*a*c) — считаем дискриминант*/
double d = (b*b) — 4 * a * c;
double x1, x2, d1;
d1=sqrt(d);/*корень из дискриминанта — заготовка для решения решаемого квадратного уравнения*/
/*1. группируем все исключения — когда решение вообще или через дискриминант невозможно*/
/*2. в каждое исключение сливаем все условия и для этих условий пишем вывод*/
/*3. оставшиеся случаи решаем через дискриминант*/
if ((a==0 && b == 0 ) || ( b==0 && ((c> 0 && a>0) || (c

    Про аномалии это я переделал. Лучше говорить аномалии, а не исключения.
    Задачу читайте внимательно: квадратное уравнение. Подразумевается, что коэффициент a не равен 0.
    Посмотрите математическую энциклопедию.

    Ещё раз повторю: Вы не сможете сделать универсальное решение, которое будет работать всегда.

    Ваше решение просто лучше моего, оно не работает, если вместо a, я ввожу rrr или другие символы.

    Аномалии про оторванные руки и кровь тоже рассматривают, есть даже задачи и модели математические про ситуацию, когда 0 взял так и случайно стал 1 в памяти ЭВМ. Про глупость, ну а что, так и есть, глупость это нормально. Ваша программа умнее моей.

    Это не ерунда, а программирование. Первый этап, который всегда должен происходить, это спецификация (уточнение) задачи. Пишется такая бумага, в которой как раз и есть «Сюда — смотри, сюда — не смотри, а здесь — рыбу заворачивали. «.

    Вопрос у Вас фактически про спецификацию (уточнение). Те пять пунктов, которые я в предыдущем комментарии написал — совершенно адекватные требования преподавателя, заказчика, сайта с хранилищем программного обеспечения. Часто преподаватели говорят — составить отчёт с инструкциями даже по такой программе как решение квадратного уравнения, это нормально. Про оторванные руки я не писал как раз как про первоочередную задачу.

    Но по минимуму решение именно то, что я написал. Оно, бывает, проходит, при быстром ответе на вопрос экзамена. Если требуют уточнить, нужно уметь уточнять. Да и ещё раз замечу, Ваше решение умнее моего, но оно не универсально.

    Математической энциклопедии под рукой не нашлось.
    «Лучше говорить аномалии, а не исключения.»
    Не помню из курса алгебры (в рамках которой изучается решение квадратных уравнений) такого термина — аномалии, но допускаю, что Вы правы и такой математический термин существует и его можно применить к квадратному уравнению.
    «Задачу читайте внимательно: квадратное уравнение. Подразумевается, что коэффициент a не равен 0.»
    Прочитал внимательно. «ax2 + bx + c = 0» — где сказано, что а не равен нулю?
    «Но по минимуму решение именно то, что я написал. Оно, бывает, проходит, при быстром ответе на вопрос экзамена.»
    Когда я пытался пропихнуть код, который не учитывает исключений — не приняли, хотя вот текст моего задания:
    «На вход вашей программы в стандартном потоке ввода подаются действительные коэффициенты A, B и C уравнения Ax² + Bx + C = 0. Выведите все его различные действительные корни в поток вывода в любом порядке, при этом разделяя корни пробелами. Гарантируется, что хотя бы один из коэффициентов уравнения не равен нулю.»
    «Вы не сможете сделать универсальное решение, которое будет работать всегда.» и «Да и ещё раз замечу, Ваше решение умнее моего, но оно не универсально.»
    Позвольте, Вы настаиваете, что невозможно написать код, который будет решать квадратное уравнение при любых действительных a, b и c? Как-то можете теоретически аргументировать? Пока что только не подкрепленные утверждения, не готов принимать их на веру.
    При каких действительных значениях а, b и c мой, реально корявый, код не работает?

    Страницы математических энциклопедий доступны через Яндекс. Только внимательнее, там есть поясняющие материалы в результатах поиска, не перепутайте.

    Квадратное уравнение — алгебраическое уравнение 2-й степени. Общий вид К. у. ax^<2>+bx+c=0, a != 0.

    Что такое аномалия?
    В тестировании программного обеспечения под аномалией понимается результат, отличный от ожидаемого. Такое поведение может быть результатом документа а также представлений и опыта тестировщиков.

    Аномалия может также относиться к проблеме удобства использования, поскольку тестовое программное обеспечение может вести себя в соответствии со спецификацией, но удобство его использования все же можно улучшить. Иногда аномалия также может быть названа дефектом / ошибкой.

    Перед тем как разрабатывать программу проводят формальную спецификацию (уточнение) задания.

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

    Если система огромная — длительное обсуждение, анализ и т.д. Для небольших программ, вот как решение квадратного уравнения, можно на бумаге составить. Вот на этой бумаге пишется задача, ИД — исходные данные, ВД — выходные данные, реакция на аномалии и т.д. В пункте реакция на аномалии рисуется таблица, по крайней мере с двумя столбцами: название аномалии, то что программа будет в этом случае делать.

    У Вас в задании слова квадратное как раз нет и аккуратно написано, что подаются только действительные числа. Формальная спецификация выполнена в задании в основном.

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

    Нельзя написать универсальное решение, без аномалий, на все случаи жизни. Тот же потенциальный пользователь программы решения квадратного уравнения, школьник, будет тыкать во всю клавиатуру, а не только в цифры.

    Представление чисел суммой двух квадратов и эллиптические кривые

    Пусть p — нечётное простое число. Довольно широко известно, что p представимо в виде суммы двух квадратов целых чисел p=a 2 +b 2 тогда и только тогда, когда p при делении на 4 даёт остаток 1: 5=1 2 +2 2 , 13=3 2 +2 2 , 17=1 2 +4 2 , . ; 3, 7, 11,… непредставимы. Куда менее известно, что a и b можно записать красивой формулой, имеющей непосредственное отношение к одной эллиптической кривой. Об этом результате 1907 года за авторством немца по фамилии Jacobsthal и о связанных вещах мы сегодня и поговорим.

    Совсем легко понять, почему 3, 7, 11 и прочие числа, дающие при делении на 4 остаток 3, непредставимы в виде a 2 +b 2 : квадрат чётного числа всегда делится на 4, квадрат нечётного числа всегда даёт остаток 1 при делении на 4, сумма двух квадратов при делении на 4 может давать остатки 0, 1 или 2, но никак не 3. Представимость простых чисел вида 4k+1 неочевидна (особенно если заметить, что простота существенна: число 21 хотя и имеет нужный остаток, но суммой двух квадратов не представляется).

    Вычеты

    Натуральных чисел бесконечно много. Бывает полезно объединять их в классы по каким-нибудь признакам. В частности, объединение по остатку от деления на какое-нибудь число n приводит к вычетам по модулю n: вычет — это класс всех чисел, которые при делении на n дают тот же остаток, что и x. Что эквивалентно, вычет состоит из всех чисел вида x+n∙k, где k целое. В рамках данного поста все вычеты будут по модулю p (того самого нечётного простого числа из введения). Естественно, различных вычетов столько же, сколько может быть остатков от деления на p, то есть ровно p. По сравнению с бесконечностью натуральных чисел переход к вычетам сильно сокращает число вариантов.
    Операции над классами далеко не всегда имеют смысл. Например, попытка сложить класс простых чисел с классом составных чисел не очень осмысленна: мы умеем складывать только числа, а у суммы простого числа и составного числа не видно свойств, общих для класса. Хотя члены клуба тавтологии и могут сказать, что сложение класса простых чисел и класса составных чисел даёт класс чисел, раскладывающихся в сумму простого числа и составного числа.

    Для вычетов, тем не менее, сложение, вычитание и умножение, «унаследованные» от натуральных чисел, дают другие вычеты. Например, 2̅+3̅=5̅: возьмём любое число с остатком 2, любое число с остатком 3, и их сумма обязательно даст остаток 5. Вообще говоря, произведение двух ненулевых вычетов по произвольному модулю может внезапно оказаться нулём, 2̅∙3̅=0̅ по модулю 6, что неприятно. Но в случае простого модуля, очевидно, такого не бывает, как говорят, нет делителей нуля. Кроме того, можно решить уравнение a̅∙x̅=b̅ (операция деления) для любых двух вычетов, кроме случая a̅=0̅, и результат будет однозначно определён. Однозначность следует из того, что произведение ненулевых вычетов ненулевое. Поскольку a̅≠0̅, то наибольший общий делитель a и p равен 1 (здесь тоже нужна простота p), расширенный алгоритм Евклида найдёт x и y такие, что a∙x+p∙y=1, откуда следует a̅∙x̅=1̅, а значит, a̅∙(b̅∙x̅)=b̅.

    Важное следствие из отсутствия делителей нуля: ненулевой многочлен от одной переменной степени n не может иметь более n корней. (Это хорошо известно для обычных целых чисел, но при использовании операций над вычетами требует дополнительного обоснования: уравнение 3̅∙x̅=0̅ по модулю 6 имеет три решения 0̅, 2̅, 4̅.) Действительно, обычное деление «в столбик» показывает, что любой многочлен f(x) можно представить в виде f(x)=(x-с)g(x)+(некоторая константа), где многочлен g(x) имеет степень на единицу меньше; если c — это корень f(x), то константа равна нулю (подставим x=c); если c’ — другой корень f(x), то он будет корнем g(x) (здесь важно отсутствие делителей нуля), так что процесс можно продолжить. Если уже набралось n корней, то оставшийся g(x) будет константой, причём ненулевой (иначе f(x)=0) и больше корней не имеет.

    Вычеты по простому модулю можно складывать, вычитать, умножать. На ненулевые вычеты можно делить. Все эти операции обладают обычными свойствами типа a̅∙b̅=b̅∙a̅. В умных книгах говорят, что вычеты по простому модулю образуют поле (а вычеты по составному модулю, где делить нельзя, а всё остальное такое же, — коммутативное кольцо). И не надо быть умной книгой, чтобы назвать это поле конечным. Поле вычетов — не единственное конечное поле, но другие конечные поля нам не понадобятся.

    Чуть-чуть про эллиптические кривые

    Эллиптическую кривую по модулю p (тому самому нечётному простому числу) можно рассматривать как набор решений уравнения y 2 =x 3 +a2x 2 +a4x+a6, где x, y и все a — вычеты (каждое решение называется одной точкой), плюс одна специальная точка O, не имеющая пары x, y. Правая часть уравнения не должна делиться на квадрат, иначе это будет не эллиптическая кривая: в уравнении типа y 2 =(x-1̅) 2 (x+2̅) можно переменную y заменить на z=y/(x-1̅) и получить зависимость второй степени, а не третьей.
    Если p≠3, то вместо переменной x можно взять x+a2/3̅, избавившись от члена с x 2 .

    Ясно, что раз x, y принадлежат конечному множеству, то число точек на эллиптической кривой тоже конечно. Сколько их? Это сложный в общем случае вопрос. Мы ограничимся кривыми вида y 2 =x 3 -k∙x. Для таких кривых полное доказательство можно уложить в один пост Хабра (хотя и довольно длинный).

    Квадратичные вычеты и невычеты

    Зададимся сначала более простым вопросом. Сколько решений есть у уравнения y 2 =c, где y, c — вычеты? Пример для p=7:

    y
    y 2

    Если c=0̅, то решение одно, y=0̅. Остальные значения y разбиваются на две половины, от 1̅ до вычета, соответствующего (p-1)/2, и от вычета, соответствующего (p+1)/2, до -1̅. Раз y 2 =(-y) 2 , вторая половина строки значений y 2 зеркально-симметрична первой половине. С другой стороны, в каждой половине повторений нет, поскольку иначе у уравнения было бы как минимум 4 решения, что невозможно для многочлена степени 2. Значит, есть (p-1)/2 вычетов c, для которых решений ровно 2, и столько же вычетов c, для которых решений нет совсем.

    Ненулевые вычеты c, для которых есть решение, называются квадратичными вычетами. Вычеты c, для которых решения нет, называются квадратичными невычетами. Стоит отметить, что квадратичный невычет — это таки вычет, просто ему не повезло быть квадратичным. Символ Лежандра показывает отношение c к квадратам: 1, если относится (то есть c — квадратичный вычет), -1, если не относится (то есть c — квадратичный невычет), 0, если c=0̅. Число решений уравнения y 2 =c равно .

    Вернёмся к эллиптическим кривым. Число вариантов y для фиксированного x мы знаем, общее число точек на кривой y 2 =x 3 -k∙x можно записать, просуммировав по всем x и не забыв про специальную точку: . Символом Fp, который раньше не появлялся, принято обозначать поле (field) вычетов по модулю p.

    Теперь мы готовы предъявить обещанные формулы для компонентов разложения p в сумму двух квадратов. Теорема. Пусть g — любой квадратичный невычет. Если p при делении на 4 даёт остаток 1, то

    причём число в первой скобке целое нечётное, число во второй скобке целое чётное. Если же p при делении на 4 даёт остаток 3, то обе суммы в скобках нулевые (а значит, число точек на эллиптических кривых равно p+1).

    Доказательство

    Поскольку пост и без того длинный, доказательство убрано под спойлер. Его можно спокойно пропустить без ущерба для восприятия.

    Если взять ненулевой вычет c и умножить его на все вычеты от до p̅-1̅, все произведения будут ненулевыми и попарно различными (если c∙x=c∙y, то c∙(x-y)=0̅, что при ненулевом c может быть только если x=y), а значит, это будет просто какая-то перестановка всех вычетов от до p̅-1̅. Следовательно, 1̅∙2̅∙. ∙(p̅-1̅)=(c∙1̅)∙(c∙2̅)∙. ∙(c∙(p̅-1̅))=c p-1 ∙1̅∙2̅∙. ∙(p̅-1̅) и c p-1 =1̅ для любого ненулевого вычета c. (Это было доказательство малой теоремы Ферма.)

    Значит, многочлен x p-1 -1=(x (p-1)/2 -1)(x (p-1)/2 +1) имеет p-1 корней. Значит, каждая скобка имеет (p-1)/2 корней (максимально возможное количество для степени скобок). Каждый квадратичный вычет — корень первой скобки (если x=c 2 , то x (p-1)/2 =c p-1 =1̅), их (p-1)/2, значит, всем квадратичным невычетам остаётся вторая скобка. Итак, символ Лежандра от c принадлежит тому же вычету, что и c (p-1)/2 . (Это было доказательство критерия Эйлера).

    Как следствие, получаем .

    Является ли -1̅ квадратичным вычетом? Зависит от знака (-1) (p-1)/2 . Если p при делении на 4 даёт остаток 1, то (p-1)/2 чётно, (-1) (p-1)/2 =1, -1̅ — квадратичный вычет. Если p при делении на 4 даёт остаток 3, то всё наоборот и -1̅ — квадратичный невычет.

    Простая часть теоремы: p даёт остаток 3 при делении на 4. Тогда в каждой скобке слагаемые с x и -x отличаются друг от друга умножением на символ Лежандра от -1̅, то есть противоположны по знаку и в сумме дают 0. Поскольку все слагаемые, кроме x=0̅, разбиваются на пары с нулевой суммой, а слагаемое с x=0̅, нулевое, вся сумма равна 0.

    Если p даёт остаток 1 при делении на 4, то слагаемые с x и -x равны и их сумма четна. Значит, вся сумма также четна и числа в скобках действительно целые. Чётность/нечётность после деления пополам ненамного сложнее: в первой скобке теоремы есть три нулевых слагаемых, остальные слагаемые разбиваются на (p-3)/2 пар с суммой ±2 в каждой паре; при любом знаке при делении на 4 получается остаток 2, вся сумма при делении на 4 даёт остаток такой же, как p-3, то есть 2. После деления пополам получим нечётное число. Во второй скобке теоремы всего одно нулевое слагаемое и (p-1)/2 пар с ±2, итоговый остаток от деления на 4 получается 0, после деления пополам остаётся чётное число.

    Пусть p при делении на 4 даёт остаток 1. Обозначим первую скобку теоремы через a, вторую через b. Мы уже знаем, что a и b целые.

    Для доказательства посчитаем двумя способами следующую странную величину N: число пятёрок вычетов (x1, y1, x2, y2, t) таких, что выполнены сразу два уравнения: y1 2 =x1 3 -t∙x1 и y2 2 =x2 3 -t∙x2.

    В первом способе сначала зафиксируем t и посчитаем число четвёрок из x, y, после чего сложим результаты для всех t. Ясно, что при фиксированном t пара (x1, y1) может быть любой неспециальной точкой кривой y 2 =x 3 -t∙x, вторая пара (x1, y1) — столь же любой неспециальной точкой той же кривой, а общее число таких пар равно квадрату числа неспециальных точек. (Собственно, поэтому мы и рассматриваем странную величину, она позволяет подобраться к a 2 и b 2 .) Если t=0, то уравнение y 2 =x 3 , как уже говорилось, не задаёт эллиптическую кривую и имеет столько же решений, сколько уравнение z 2 =x (где y=z∙x), то есть ровно p. При t=1 получается p+2a решений, при t=gp+2b решений. Что насчёт остальных значений t?

    Если y 2 =x 3 -t∙x и c — какой-то ненулевой вычет, то c 6 y 2 =c 6 x 3 -c 6 t∙x, что эквивалентно (c 3 y) 2 =(c 2 x) 3 -c 4 t∙(c 2 x). Иными словами, если (x,y) — решение уравнения с t, то (c 2 x,c 3 y) — решение уравнения с c 4 t, так что число решений с t и с c 4 t совпадает. Сколько есть разных ненулевых вычетов вида c 4 ? С одной стороны, не менее (p-1)/4: (p-1) значений c могут «склеиваться» в группы размером не более 4. С другой стороны, если (p-1)/4 — целое число, то все такие вычеты — корни многочлена x (p-1)/4 -1, так что их не может быть больше (p-1)/4. Значит, их ровно (p-1)/4.
    Итак, (p-1)/4 кривых имеют p+2a неспециальных точек, ещё (p-1)/4 кривых имеют p+2b неспециальных точек. Это уже половина всего, что надо.

    Если y 2 =x 3 -t∙x, то g 3 y 2 =(g∙x) 3 -(g 2 t)(g∙x). При фиксированном x число решений уравнения g 3 y 2 =. равно 2 — число решений уравнения y 2 =. . Значит, число неспециальных точек на кривой с t=g 2 (а следовательно, на (p-1)/4 подобных кривых) равно 2p-(p+2a)=p-2a. Аналогично число неспециальных точек на кривой с t=g 3 равно 2p-(p+2b)=p-2b.

    Итак, первый способ вычисления даёт

    Во втором способе вычисления N сначала зафиксируем x1 и x2 и посчитаем число троек t и y, после чего сложим результаты для всех пар x. При x1=x2=0̅ есть ровно p вариантов: оба y должны быть нулями, t может быть любым. При x1=0̅ и ненулевом x2 должно быть y1=0, y2 может быть любым, t вычисляется однозначно, получается снова p вариантов. Ситуация с нулевым x2 и ненулевым x1 симметрична. Наконец, пусть оба x ненулевые. Тогда t=x1 2 -(y1 2 /x1) и нужно посчитать число пар y с условием (x2/x1)y1 2 =y2 2 +x2(x1 2 -x2 2 ).

    Если x1=x2, то уравнение превращается в условие совпадения квадратов y, и различных пар y получается 1+2(p-1): нулевая и по два варианта y2 для каждого ненулевого y1. Если x1=-x2, ситуация аналогичная, поскольку p даёт остаток 1 при делении на 4 и -1̅ — квадратичный вычет.

    Если x2/x1 — квадратичный вычет, не равный ±1̅, то существует какое-то ненулевое c такое, что c 2 =x2/x1. Тогда (c 2 y1 2 -y2 2 )=(c∙y1-y2)(c∙y1+y2)=x2(x1 2 -x2 2 ), выражение c∙y1-y2 может быть любым ненулевым вычетом, по нему однозначно определяется c∙y1+y2 и, следовательно, y1 и y2. Итого p-1 вариантов.

    Если x2/x1 — квадратичный невычет, то аналогично эллиптическим кривым число решений равно 2p минус число решений в случае квадратичного вычета, то есть 2p-(p-1)=p+1.

    Суммируем. Есть один вариант с x1=x2=0, дающий p решений. Есть 2(p-1) вариантов, где один из x нулевой, а другой ненулевой, каждый из вариантов даёт p решений. Есть 2(p-1) вариантов с x2=±x1, каждый из которых даёт 2p-1 решений. Есть (p-1)((p-1)/2-2) вариантов, где x1 — произвольный ненулевой вычет, а x2/x1 — квадратичный вычет, отличный от ±1̅, каждый из этих вариантов даёт p-1 решений. Наконец, остаётся (p-1) 2 /2 вариантов, где x1 — произвольный ненулевой вычет, а x2/x1 — квадратичный невычет, в каждом из этих вариантов p+1 решений. Итого .

    Сравнение двух выражений для N завершает доказательство.

    Причём здесь криптография?

    Вычислять a и b, подсчитывая p раз символы Лежандра, непрактично. Куда быстрее с этим справится алгоритм Cornacchia. Практическая польза — использовать формулу для a, b в обратную сторону: можно доказать, что разложение p=a 2 +b 2 единственно с точностью до перестановки a и b и смены знаков, так что нахождение a и b влечёт знание числа точек на кривых y 2 =x 3 -t∙x для любого ненулевого t, это будет p+1±2a и p+1±2b.

    Знание числа точек на кривой важно для криптографии на этой кривой. На эллиптической кривой можно ввести операцию сложения точек (о чём слышали, наверное, все, кто хоть что-то знает о криптографии) со специальной точкой O в роли нуля. На основе операции сложения можно определить умножение на натуральное число: 2P=P+P, 3P=P+P+P и так далее. Так вот, можно доказать, что если n — порядок кривой, то nP=O для любой точки P. Зная n, c, d, можно решать уравнения вида x∙(cP)=dP полностью аналогично делению вычетов: расширенный алгоритм Евклида найдёт x, y такие, что c∙x+n∙y=1, откуда x∙(cP)+y∙(nP)=P, то есть x∙(cP)=P. При этом, если c, d неизвестны, а cP и dP заданы координатами, то эффективных методов деления в общем случае неизвестно.

    Вычислить число точек на заданной кривой довольно сложно (полиномиальный алгоритм существует, но на практике довольно медленный). Чтобы построить кривую с какими-нибудь свойствами на число точек, можно пытаться взять случайные коэффициенты и вычислять число точек в цикле, пока не получится то, что надо, но придётся подождать. К счастью, есть другой способ.

    Если нас устраивает простое число вида 4k+1 и кривая специального вида y 2 =x 3 -t∙x (в некотором смысле это одна и та же кривая при любом ненулевом t) с числом точек p+1±2a или p+1±2b, можно её и взять. Что насчёт других кривых?

    Немного позднее, в 1911 году, уже другой автор von Schrutka получил аналогичный результат для кривых вида y 2 =x 3 -t, простых вида 6k+1, представления p=a 2 +3b 2 . Значит, найти число точек на кривой y 2 =x 3 -t опять же позволяет алгоритм Cornacchia.

    Позднее, по мере развития теории эллиптических кривых, выяснилось, что если есть какое-то представление 4p=a’ 2 +d∙b’ 2 , где d натуральное, при делении на 4 даёт остаток 0 или 3, взаимно простое с p и не слишком большое, то можно эффективно (даже если p очень большое) построить кривую, которая будет иметь ровно p+1±a’ точек. Два наименьших значения d=3 и d=4 соответствуют кривым y 2 =x 3 -t и y 2 =x 3 -t∙x. Пример для d=163:

    При нечётном p≠163 это уравнение задаёт эллиптическую кривую. Если 4p представимо в виде a’ 2 +163b’ 2 с целыми a’, b’, то число точек на эллиптической кривой равно p+1±a’. Если нет, то p+1. К сожалению, доказательство использует «тяжёлую» теорию, поэтому здесь не будет даже намёков.
    Обычно, впрочем, будут получаться радикалы. Например, для d=15: . Если 4p раскладывается в сумму a’ 2 +d∙b’ 2 и p взаимно просто с d, то все радикалы обязательно извлекутся (например, для d=15 обязательно найдётся вычет c, для которого c 2 =5̅ ) и получится эллиптическая кривая с нужным числом точек.

    Вычисления в полях вычетов

    Рассмотрим некоторые особенности вычислений в полях вычетов. Найдем, например, определитель , элементы которого суть вычеты из поля
    (Z3, +3, ×3). Если действовать «по науке», надо писать

    Можно, однако, поступить проще. Будем считать элементы определителя обычными целыми числами из кольца Z, тогда d=1×1–2×2= –3.

    Как найти для целого числа из Z соответствующий вычет из Zn? Для этого надо к числу прибавить (или отнять от него) величину, кратную n, чтобы результат принадлежал множеству вычетов Zn=<0,1,¼,n–1>. В данном случае прибавим 3 и получим –3+3=0 – тот же результат.

    В дальнейшем станем действовать аналогично, к тому же не будем педантично ставить индекс +n, ×n около символов операций, обозначая их просто + и
    × , если значение индекса n ясно из контекста.

    Рассмотрим решение системы линейных уравнений над полем вычетов.

    Пример. Решим над тремя полями: Q, Z3, Z5 систему уравнений A×X=B, где . т.е.

    Заметим, что коэффициенты системы (0, 1 и 2), включая свободные члены, можно рассматривать не только как числа (т.е. элементы поля Q), но и как элементы интересующих нас конечных полей Z3 и Z5. В противном случае постановку задачи пришлось бы как-то изменять.

    Решать систему будем по правилу Крамера. Вычислим над полем Q четыре опре­делителя:

    .

    Значения неизвестных найдем по формулам Крамера: .

    Приведем значения определителей в поле вычетов Z3=<0,1,2>, получим: D=0, Dx=2, Dy=2, Dz=2. Видим, что над этим полем система несовместна.

    Приведем значения определителей в поле вычетов Z5=<0,1,2,3,4>: D=2, Dx=4, Dy=1, Dz=4. Значения неизвестных снова найдем по формулам Крамера: . Как понимать найденное значение неизвестной ? Дробь не является элементом поля Z5, поэтому ее надо рассматривать как выражение, которое необходимо вычислить согласно правилам действий в этом поле: (поскольку произведение 2×3=6, а 6 в поле Z5 переходит в 1). Итак, решение системы уравнений над полем Z5 таково: x=2, y=3, z=2.

    Сделаем проверку (символом Þ обозна­чен переход от целых чисел к вычетам по модулю 5). Первое уравнение: 1×2+2×2=6 Þ 1, второе уравнение: 1×3+2×2=7 Þ 2, третье уравнение: 2×2+1×2=6 Þ 1. Видим, что найден­ные значения вычетов удовлетворяют сис­теме уравнений над полем Z5.

    Решим ту же систему над полем Z3 методом Гаусса. Составим расширенную матрицу: . Если бы мы решали систему над полем рациональных чисел Q, то первым шагом выполнили бы операцию (3)–2×(1). В поле Z3 коэффициенту –2 соответствует вычет 1, поэтому выполним операцию (3)+1×(1). В 1-ом столбце имеем 2+1×1=3Þ0, во 2-ом столбце сохранится 0, в третьем столбце 1+1×2=3Þ0, в столбце свободных членов 1+1×1=2, так что . В алгебраической форме 3-е уравнение этой системы имеет вид 0×x+0×y+0×z=2. Очевидно, что оно не имеет решения, поэтому система над полем Z3 несовместна.

    Найдем решение той же системы над полем Z5 методом Гаусса. Вместо операции (3)–2×(1), с которой начинается решение этой системы над полем рациональных чисел Q, выполним операцию (3)+3×(1), поскольку в поле Z5 коэффициенту –2 соответствует вычет 3. В 1-ом столбце получим 2+3×1=5Þ0, во 2-ом столбце сохранится 0, в третьем, в 3-ем столбце имеем 1+3×2=7Þ2, в столбце свободных членов 1+3×1=4. Таким образом, получим . 3-ю строку этой матрицы можно сократить (разделить) на 2: .

    Теперь выполним операции (1)+3×(3) и (2)+3×(3) – в 1-й и во 2-й строках 3-го столбца получится 2+3×1=5Þ0, остальные элементы этих строк сохраняться: .

    Видим, что получилось решение, ранее найденное по правилу Крамера: x=2, y=3, z=2.


    источники:

    http://habr.com/ru/post/189618/

    http://lektsii.org/14-33211.html