2012-02-06 445 views
4

我需要在有限域F17上绘制椭圆曲线(换句话说,我想在曲线上绘制一些特定的点),但不知何故,我没有修正它。如何使用matlab绘制有限域上的椭圆曲线

的曲线由以下公式定义:

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

我尝试下面的方法,但它不能正常工作。

对于x = 0:16,情节(X,MOD(SQRT(X^3 + X + 1),16), 'R')”,端

有人可以帮忙吗?

[更新]

据Nathan和比尔的建议,这里是一个稍微修改后的版本。

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

然而,我觉得这个数字是WRONG,例如y不是整数当x = 4。

enter image description here

+0

在你的曲线定义中,你写'mod 17'并且在你的matlab函数'mod 16'中,哪一个是正确的? – Lucas 2012-02-06 13:32:37

+0

问题在于你使用'sqrt'。 matlab sqrt函数在有限体上不起作用。 – Lucas 2012-02-06 13:47:44

+0

椭圆曲线在有限域上的绘制并没有什么意义,它看起来就像随机散射点。要计算平方根mod是一个素数,请参阅[this](http://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm)算法,这在matlab中不应太难实现。 – 2012-02-07 22:37:58

回答

2

您必须测试满足方程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

+1,对我来说看起来OK(请注意,这些点与y坐标y和17-y配对)。 – Krystian 2012-02-06 14:33:23

0

Matlab的工作与本地的载体。

你的语法很接近,但需要矢量:

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

注意在x.^3.。这会告诉Matlab分别对x的每个元素进行多维数据集,而不是将矢量x提升为第3次方,这并不意味着什么。

+0

尝试了你的建议之后,我发现Matlab意外地绘制了一条曲线而不是一些点) – 2012-02-06 09:18:10

+1

尝试在@ Nathan的答案中将''r''改为''ro''以获得点。 – 2012-02-06 10:30:52

+0

你的mod()应​​该是17,而不是16,因为它的FF_ {17}。 – Krystian 2012-02-06 14:29:39

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