2012-02-06 443 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