1 %% Elliptic curve messing about
3 %% y^2 = x^3 + a x^2 + b
7 numeric minx, maxx, miny, maxy;
20 vardef ecy(expr x) = sqrt (x*x*x + a*x + b) enddef;
21 vardef ecadd(expr u, v) =
22 numeric ux, uy, vx, vy;
25 ux := xpart u; uy = ypart u;
26 vx := xpart v; vy = ypart v;
28 m := (3*ux*ux + a)/(2*uy);
30 m := (vy - uy)/(vx - ux);
33 dy := m * (ux - dx) - uy;
38 maxy = ecy(maxx); miny = -maxy;
40 v = u * (maxx - minx)/(maxy - miny);
41 gt = identity xscaled u yscaled v shifted (10 cm, 10 cm);
43 vardef eclabel@#(expr l, z) =
44 pickup pencircle scaled 1/4 pt;
45 draw fullcircle scaled 1 mm shifted (z transformed gt);
46 draw thelabel@#(l, z transformed gt);
53 pickup pencircle scaled 1/4 pt;
54 drawarrow ((minx, 0) -- (maxx, 0)) transformed gt;
55 drawarrow ((0, miny) -- (0, maxy)) transformed gt;
57 pickup pencircle scaled 2/3 pt;
58 for x = minx step 0.01 until maxx:
70 draw (reverse p reflectedabout (O, O + right) .. p .. cycle)
77 draw (reverse p reflectedabout (O, O + right) .. p) transformed gt;
81 vardef setbackground(expr c) =
85 pic := currentpicture;
86 currentpicture := nullpicture;
87 fill (bbox pic) withcolor c;
93 x0 := -5/4; x1 := 1/4;
94 y0 := -ecy(x0); y1 := ecy(x1);
97 pickup pencircle scaled 1/4 pt;
98 draw ((-0.1)[z0, z3] -- 1.1[z0, z3]) transformed gt dashed evenly;
99 draw ((-0.1)[z2, z3] -- 1.1[z2, z3]) transformed gt dashed evenly;
100 eclabel.bot(btex $P_0$ etex, z0);
101 eclabel.top(btex $P_1$ etex, z1);
102 eclabel.rt(btex $P'$ etex, z3);
103 eclabel.lft(btex $P_2 = -P' = P_0 + P_1$ etex, z2);
104 setbackground(white);
113 pickup pencircle scaled 1/4 pt;
114 draw ((-0.1)[z0, z2] -- 1.1[z0, z2]) transformed gt dashed evenly;
115 draw ((-0.1)[z2, z1] -- 1.1[z2, z1]) transformed gt dashed evenly;
116 eclabel.top(btex $P_0$ etex, z0);
117 eclabel.rt(btex $P'$ etex, z2);
118 eclabel.lft(btex $P_1 = -P' = 2 P_0$ etex, z1);
119 setbackground(white);
127 pickup pencircle scaled 1/4 pt;
128 draw ((x0, miny) -- (x0, maxy)) transformed gt dashed evenly;
129 eclabel.rt(btex $P_0$ etex, z0);
130 eclabel.rt(btex $P_1$ etex, z1);
131 setbackground(white);