質問編集履歴

4

コードミス

2021/01/15 04:08

投稿

kyamamama
kyamamama

スコア4

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- def third_mathod(P,d):
23
+ def third_mathod(d):
24
24
 
25
25
  bin_str=Base_10_to_n(d,3)
26
26
 
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- print(third_mathod(G,3))#3
35
+ print(third_mathod(3))#3
36
36
 
37
37
  ```
38
38
 

3

コードミス

2021/01/15 04:07

投稿

kyamamama
kyamamama

スコア4

test CHANGED
File without changes
test CHANGED
@@ -24,15 +24,11 @@
24
24
 
25
25
  bin_str=Base_10_to_n(d,3)
26
26
 
27
- if bin_str[0]==1:
28
-
29
- Q = "2"
30
-
31
- else :Q="3"
27
+ Q="2" if bin_str[0]==1 else "3"
32
-
33
-
34
28
 
35
29
  return Q
30
+
31
+
36
32
 
37
33
 
38
34
 

2

コードミス

2021/01/15 04:06

投稿

kyamamama
kyamamama

スコア4

test CHANGED
@@ -1 +1 @@
1
- 楕円加算について 分岐
1
+ if文 条件の付け方
test CHANGED
@@ -1,158 +1,14 @@
1
- 楕円加算につい研究しています
1
+ if文の分岐で困っています
2
2
 
3
- おそらく、最後def third_mathod(P,d)で問題起きているのだ思うのですが、解決策が見つからず困っています.
3
+ 以下ようにプログラミングを組んだとき,なぜか結果「3」ってしまいます
4
4
 
5
- 3進法に直したdをBase_10_to_n(d,3)とし,Base_10_to_n(d,3)[0]1または2のときで初期値変えるいうことをしたいと考えています.
5
+ bin_str[0]=1でQ=2を返せ組みたいと考えていますが、どこがおかしいのでしょうか?
6
6
 
7
-
7
+ ご回答よろしくお願いします
8
-
9
-
10
-
11
-
12
8
 
13
9
  ```ここに言語を入力
14
10
 
15
- #Fp上のy-2=x^3+ax+yでの
16
-
17
- p,a,b=11,1,2
18
-
19
- G=(1,2)
20
-
21
- def inv(n,p):#inv(obj)objのビット単位反転を返す
22
-
23
- return pow(n,p-2,p)
24
-
25
-
26
-
27
- def div(c,w):
28
-
29
- return(c*inv(w,p))%p
30
-
31
-
32
-
33
- def ec_double(A):#P=Qのとき
34
-
35
- if A[0]==float("infinity"):
36
-
37
- x=float('infinity')
38
-
39
- y=float('infinity')
40
-
41
-
42
-
43
- else:
44
-
45
- l=div(3*A[0]**2+a,2*A[1])
46
-
47
- if l==0:
48
-
49
- x=float('infinity')
50
-
51
- y=float('infinity')
52
-
53
- else:
54
-
55
- x=(l**2-A[0]-A[0])%p
56
-
57
- y=(l*(A[0]-x)-A[1])%p
58
-
59
- return x,y
60
-
61
-
62
-
63
-
64
-
65
- def ec_add(A,B):
66
-
67
- if A[0]==B[0] and A[1]==B[1]:
68
-
69
- l=div(3*A[0]**2+a,2*A[1])
70
-
71
- x=(l**2-A[0]-A[0])%p
72
-
73
- y=(l*(A[0]-x)-A[1])%p
74
-
75
-
76
-
77
- elif A[0]==B[0] and A[1]!=B[1]:
78
-
79
- x=float('infinity')
80
-
81
- y=float('infinity')
82
-
83
-
84
-
85
- elif A[0]==float('infinity'):
86
-
87
- x=B[0]
88
-
89
- y=B[1]
90
-
91
-
92
-
93
- elif B[0]==float('infinity'):
94
-
95
- x=A[0]
96
-
97
- y=A[1]
98
-
99
-
100
-
101
- else:
102
-
103
- l=div(B[1]-A[1],B[0]-A[0])
104
-
105
- x=(l**2-A[0]-B[0])%p
106
-
107
- y=(l*(A[0]-x)-A[1])%p
108
-
109
- return x,y
110
-
111
-
112
-
113
-
114
-
115
- def ec_third(A):
116
-
117
- if A[0]==float('infinity'):
118
-
119
- x=float('infinity')
120
-
121
- y=float('infinity')
122
-
123
-
124
-
125
- elif A[1]==0:
126
-
127
- x=A[0]
128
-
129
- y=A[1]
130
-
131
-
132
-
133
- else:
134
-
135
- t=div(3*A[0]**2+a,2*A[1])
136
-
137
- l=div(2*A[1]-t*(3*A[0]-t**2),3*A[0]-t**2)
138
-
139
- if l==0:
140
-
141
- x=float('infinity')
142
-
143
- y=float('infinity')
144
-
145
- else:
146
-
147
- x=(l**2-t**2+A[0])%p
148
-
149
- y=(l*(2*t**2-3*A[0]-l**2)-(t*(3*A[0]-t**2)-A[1]))%p
150
-
151
- return x,y
152
-
153
-
154
-
155
- def Base_10_to_n(X,n):
11
+ def Base_10_to_n(X,n):#3進法に直す
156
12
 
157
13
  if(int(X/n)):
158
14
 
@@ -166,58 +22,30 @@
166
22
 
167
23
  def third_mathod(P,d):
168
24
 
169
- Q = P if Base_10_to_n(d,3)[0] == 1 else ec_double(P)
25
+ bin_str=Base_10_to_n(d,3)
170
26
 
171
- for bit in Base_10_to_n(d,3)[1:]:#1番目の要素から最後の要素まで取得
27
+ if bin_str[0]==1:
172
28
 
173
- Q=ec_third(Q)
29
+ Q = "2"
174
30
 
175
- if bit =="1":
31
+ else :Q="3"
176
32
 
177
- Q=ec_add(Q,P)
33
+
178
-
179
- else:
180
-
181
- Q=ec_add(Q,P)
182
-
183
- Q=ec_add(Q,P)
184
34
 
185
35
  return Q
186
36
 
187
37
 
188
38
 
189
- G1=third_mathod(G,1)
190
-
191
- G2=third_mathod(G,2)
192
-
193
- G3=third_mathod(G,3)
39
+ print(third_mathod(G,3))#3
194
-
195
- print(G1)#(10,0)
196
-
197
- print(G2)#(10,0)
198
-
199
- print(G3)#(10,0)
200
40
 
201
41
  ```
202
42
 
203
- 本当の答えは上から(1,2),(10,0).(1,9)になります
204
43
 
44
+
205
- みに
45
+ 以下のように返ってくるので,関数Base_10_to_nは問題いのかと....
206
46
 
207
47
  ```ここに言語を入力
208
48
 
209
- Q = P if Base_10_to_n(d,3)[0] == 1 else ec_double(P)
49
+ print(Base_10_to_n(3,3)[0])#1
210
50
 
211
51
  ```
212
-
213
- の文を
214
-
215
- ```ここに言語を入力
216
-
217
-  Q=P
218
-
219
- ```
220
-
221
- のみにした場合初期値がすべて一緒になってしまうのでG3(=10)とG6(=20)の値が一緒になってしまいます(()の中は3進法).Q=Pのみ組んだ場合,手計算でBase_10_to_n(d,3)[0]=1のときは値が一致しているのでdef third_mathod(P,d)以外の関数には問題はないと思います.
222
-
223
- わかりにくい説明ですいません、ご回答よろしくお願いします

1

誤字

2021/01/15 04:03

投稿

kyamamama
kyamamama

スコア4

test CHANGED
File without changes
test CHANGED
@@ -218,6 +218,6 @@
218
218
 
219
219
  ```
220
220
 
221
- のみにした場合初期値がすべて一緒になってしまうのでG3(=10)とG6(=20)の値が一緒になってしまいます(()の中は3進法).手計算でBase_10_to_n(d,3)[0]=1のときは値が一致しているのでdef third_mathod(P,d)以外の関数には問題はないと思います.
221
+ のみにした場合初期値がすべて一緒になってしまうのでG3(=10)とG6(=20)の値が一緒になってしまいます(()の中は3進法).Q=Pのみ組んだ場合,手計算でBase_10_to_n(d,3)[0]=1のときは値が一致しているのでdef third_mathod(P,d)以外の関数には問題はないと思います.
222
222
 
223
223
  わかりにくい説明ですいません、ご回答よろしくお願いします