我需要在有限域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')
但是,我觉得这个数字是错误,例如,当x = 4时,y不是整数。
答案 0 :(得分:3)
您必须测试满足等式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;
答案 1 :(得分:0)
Matlab本身适用于矢量。
你的语法很接近,但需要进行矢量化:
x = 0:16
plot(x, mod(sqrt(x.^3+x+1), 16),'r')
请注意.
中的x.^3
。这告诉Matlab单独复制x
的每个元素,而不是将向量x
提升到第3个幂,这并不意味着什么。
答案 2 :(得分:0)
如果要在真实数字上绘图,可以使用此代码:
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
。