Как вы строите эллиптические кривые над конечным полем, используя Matlab - PullRequest
5 голосов
/ 06 февраля 2012

Мне нужно нарисовать эллиптическую кривую над конечным полем F17 (другими словами, я хочу нарисовать некоторые конкретные точки на кривой), но почему-то я не понимаю это правильно.

Криваяопределяется уравнением:

y^2 = x^3 +x + 1 (mod 17)

Я пробовал способ ниже, но он не может работать.

для x = 0:16,сюжет (x, mod (sqrt (x ^ 3 + x + 1), 16), 'r') ', конец

Может кто-нибудь помочь?

[Обновление]

В соответствии с предложениями Натана и Билла, здесь есть слегка измененная версия.

 x = 0:18
 plot(mod(x,16), mod(sqrt(x.^3+x+1), 16),'ro')

Однако я чувствую, что цифра составляет НЕПРАВИЛЬНО , например, y не является целым числом, когда x = 4.

enter image description here

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

Вы должны проверить все точки, которые удовлетворяют уравнению y^2 = x^3 +x + 1 (mod 17).Поскольку это конечное поле, вы не можете просто взять квадратный корень с правой стороны.

Вот как я бы это сделал:

a=0:16  %all points of your finite field
left_side = mod(a.^2,17)  %left side of the equation
right_side = mod(a.^3+a+1,17) %right side of the equation

points = [];


%testing if left and right side are the same 
%(you could probably do something nicer here)
for i = 1:length(right_side)
    I = find(left_side == right_side(i));
    for j=1:length(I)
        points = [points;a(i),a(I(j))];
    end
end

plot(points(:,1),points(:,2),'ro')
set(gca,'XTick',0:1:16)
set(gca,'YTick',0:1:16)
grid on;

elliptic curve

0 голосов
/ 09 мая 2017

Вы можете использовать этот код, если хотите построить график на действительных числах:

syms x y;
v=y^2-x^3-x-1;
ezplot(v, [-1,3,-5,5]);

Но для построения графика по модулю сначала вы можете написать код ниже:

X=[]; for x=[0:16], z=[x; mod(x^3+x+1,17)]; X=[X, z]; end, X,

Затем вы можете построить X с помощью координатной матрицы.

0 голосов
/ 06 февраля 2012

Matlab изначально работает с векторами.

Ваш синтаксис был близок, но должен быть векторизован:

x = 0:16
plot(x, mod(sqrt(x.^3+x+1), 16),'r')

Обратите внимание на . в x.^3. Это заставляет Matlab кубировать каждый элемент x индивидуально, в отличие от повышения вектора x до 3-й степени, что ничего не значит.

...