teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コードミス

2021/01/14 05:23

投稿

kyamamama
kyamamama

スコア4

title CHANGED
File without changes
body CHANGED
@@ -8,8 +8,8 @@
8
8
 
9
9
  数字を3進法に直し値が0,1,2ごとにそれぞれ以下のように関数に当てはめるようにしたいと思っています
10
10
  0の場合はec_third(Q)のみ
11
- 1の場合はec_third(Q)からec_add(Q,G),ec_third(Q)
11
+ 1の場合はec_third(Q)からec_add(Q,P),ec_third(Q)
12
- 2の場合はec_third(Q)からG2=ec_double(G),ec_add(Q,G2)
12
+ 2の場合はec_third(Q)からG2=ec_double(P),ec_add(Q,P)
13
13
 
14
14
 
15
15
  おそらくbite=2のときが間違えているようです

2

追加の問題が発生したため

2021/01/14 05:23

投稿

kyamamama
kyamamama

スコア4

title CHANGED
File without changes
body CHANGED
@@ -8,8 +8,8 @@
8
8
 
9
9
  数字を3進法に直し値が0,1,2ごとにそれぞれ以下のように関数に当てはめるようにしたいと思っています
10
10
  0の場合はec_third(Q)のみ
11
- 1の場合はec_add(Q,G),ec_third(Q)
11
+ 1の場合はec_third(Q)からec_add(Q,G),ec_third(Q)
12
- 2の場合はG2=ec_double(G),ec_add(Q,G2)
12
+ 2の場合はec_third(Q)からG2=ec_double(G),ec_add(Q,G2)
13
13
 
14
14
 
15
15
  おそらくbite=2のときが間違えているようです
@@ -17,69 +17,6 @@
17
17
  ご回答宜しくお願い致します
18
18
 
19
19
  ```ここに言語を入力
20
- Fp上のy-2=x^3+ax+yでの計算
21
- p,a,b=11,1,2
22
- G=(1,2)
23
- def inv(n,p):#inv(obj)objのビット単位反転を返す
24
- return pow(n,p-2,p)
25
-
26
- def div(c,w):
27
- return(c*inv(w,p))%p
28
-
29
- def ec_double(A):#P=Qのとき
30
- if A[0]==float("infinity"):
31
- x=float('infinity')
32
- y=float('infinity')
33
-
34
- else:
35
- l=div(3*A[0]**2+a,2*A[1])
36
- if l==0:
37
- x=float('infinity')
38
- y=float('infinity')
39
- else:
40
- x=(l**2-A[0]-A[0])%p
41
- y=(l*(A[0]-x)-A[1])%p
42
- return x,y
43
-
44
- def ec_add(A,B):
45
- if A[0]==B[0]:
46
- x=float('infinity')
47
- y=float('infinity')
48
-
49
- elif A[0]==float('infinity'):
50
- x=B[0]
51
- y=B[1]
52
-
53
- elif B[0]==float('infinity'):
54
- x=A[0]
55
- y=A[1]
56
-
57
- else:
58
- l=div(B[1]-A[1],B[0]-A[0])
59
- x=(l**2-A[0]-B[0])%p
60
- y=(l*(A[0]-x)-A[1])%p
61
- return x,y
62
-
63
- def ec_third(A):
64
- if A[0]==float('infinity'):
65
- x=float('infinity')
66
- y=float('infinity')
67
-
68
- elif A[1]==0:
69
- x=A[0]
70
- y=A[1]
71
-
72
- else:
73
- t=div(3*A[0]**2+a,2*A[1])
74
- l=div(2*A[1]-t*(3*A[0]-t**2),3*A[0]-t**2)
75
- if l==0:
76
- x=float('infinity')
77
- y=float('infinity')
78
- else:
79
- x=(l**2-t**2+A[0])%p
80
- y=(l*(2*t**2-3*A[0]-l**2)-(t*(3*A[0]-t**2)-A[1]))%p
81
- return x,y
82
-
83
20
  def Base_10_to_n(X,n):3進法に直す
84
21
  if(int(X/n)):
85
22
  return Base_10_to_n(int(X/n),n)+str(X%n)

1

コードミス

2021/01/14 05:21

投稿

kyamamama
kyamamama

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- 楕円加算について研究しています.
1
+ > 楕円加算について研究しています.
2
2
  手計算では合っているのにプログラミングにすると違う答えが返ってきてしまいます
3
3
  ec_double
4
4
  ec_add
@@ -13,9 +13,10 @@
13
13
 
14
14
 
15
15
  おそらくbite=2のときが間違えているようです
16
+ G2の値は(10,0)が正解です
16
17
  ご回答宜しくお願い致します
17
18
 
18
-
19
+ ```ここに言語を入力
19
20
  Fp上のy-2=x^3+ax+yでの計算
20
21
  p,a,b=11,1,2
21
22
  G=(1,2)
@@ -86,12 +87,12 @@
86
87
 
87
88
  def third_mathod(P,d):
88
89
  Q=P
89
- bin_str=Base_10_to_n(d,3)
90
- for bit in bin_str[1:]:#1番目の要素から最後の要素まで取得
90
+ for bit in Base_10_to_n(d,3)[1:]:#1番目の要素から最後の要素まで取得
91
91
  Q=ec_third(Q)
92
92
  if bit =="1":
93
93
  Q=ec_add(Q,P)
94
94
  elif bit =="2":
95
95
  P=ec_double(P)
96
96
  Q=ec_add(Q,P)
97
- return Q
97
+ return Q
98
+ ```