Elliptic curve arithmetic: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (Promote to task, lots of examples, little controversy) |
(add PicoLisp) |
||
Line 1,100: | Line 1,100: | ||
a + b + d = Zero |
a + b + d = Zero |
||
a * 12345 = (10.759, 35.387) |
a * 12345 = (10.759, 35.387) |
||
</pre> |
|||
=={{header|PicoLisp}}== |
|||
<lang PicoLisp>(scl 16) |
|||
(load "@lib/math.l") |
|||
(setq *B 7) |
|||
(de from_y (Y) |
|||
(let |
|||
(A (* 1.0 (- (* Y Y) *B)) |
|||
B (pow (abs A) (*/ 1.0 1.0 3.0)) ) |
|||
(list |
|||
(if (gt0 A) B (- B)) |
|||
(* Y 1.0) ) ) ) |
|||
(de prn (P) |
|||
(if (is_zero P) |
|||
"Zero" |
|||
(pack |
|||
(round (car P) 3) |
|||
" " |
|||
(round (cadr P) 3) ) ) ) |
|||
(de neg (P) |
|||
(list (car P) (*/ -1.0 (cadr P) 1.0)) ) |
|||
(de is_zero (P) |
|||
(or |
|||
(=T (car P)) |
|||
(=T (cadr P)) |
|||
(> (length (car P)) 20) ) ) |
|||
(de dbl (P) |
|||
(if (is_zero P) |
|||
P |
|||
(let |
|||
(Y |
|||
(*/ |
|||
1.0 |
|||
(*/ 3.0 (car P) (car P) (** 1.0 2)) |
|||
(*/ 2.0 (cadr P) 1.0) ) |
|||
X |
|||
(- |
|||
(*/ Y Y 1.0) |
|||
(*/ 2.0 (car P) 1.0) ) ) |
|||
(list |
|||
X |
|||
(- |
|||
(*/ Y (- (car P) X) 1.0) |
|||
(cadr P) ) ) ) ) ) |
|||
(de add (A B) |
|||
(cond |
|||
((= A B) (dbl A)) |
|||
((is_zero A) B) |
|||
((is_zero B) A) |
|||
(T |
|||
(let Z (- (car B) (car A)) |
|||
(if (=0 Z) |
|||
(list T T) |
|||
(let |
|||
(Y (*/ 1.0 (- (cadr B) (cadr A)) Z) |
|||
X |
|||
(- (*/ Y Y 1.0) (car A) (car B)) ) |
|||
(list |
|||
X |
|||
(- |
|||
(*/ Y (- (car A) X) 1.0) |
|||
(cadr A) ) ) ) ) ) ) ) ) |
|||
(de mul (P N) |
|||
(let R (list T T) |
|||
(for (I 1 (>= N I) (* I 2)) |
|||
(when (gt0 (& I N)) |
|||
(setq R (add R P)) ) |
|||
(setq P (dbl P)) ) |
|||
R ) ) |
|||
(setq |
|||
A (from_y 1) |
|||
B (from_y 2) ) |
|||
(prinl "A: " (prn A)) |
|||
(prinl "B: " (prn B)) |
|||
(setq C (add A B)) |
|||
(prinl "C: " (prn C)) |
|||
(setq D (neg C)) |
|||
(prinl "D: " (prn D)) |
|||
(prinl "D + C: " (prn (add C D))) |
|||
(prinl "A + B + D: " (prn (add A (add B D)))) |
|||
(prinl "A * 12345: " (prn (mul A 12345)))</lang> |
|||
{{out}} |
|||
<pre> |
|||
A: -1.817 1.000 |
|||
B: -1.442 2.000 |
|||
C: 10.375 -33.525 |
|||
D: 10.375 33.525 |
|||
D + C: Zero |
|||
A + B + D: Zero |
|||
A * 12345: 10.759 35.387 |
|||
</pre> |
</pre> |
||