| ... | @@ -341,7 +341,7 @@ pub const Fe = struct { | ... | @@ -341,7 +341,7 @@ pub const Fe = struct { |
| 341 | } | 341 | } |
| 342 | | 342 | |
| 343 | /// Square a field element `n` times | 343 | /// Square a field element `n` times |
| 344 | inline fn sqn(a: Fe, comptime n: comptime_int) Fe { | 344 | fn sqn(a: Fe, n: usize) Fe { |
| 345 | var i: usize = 0; | 345 | var i: usize = 0; |
| 346 | var fe = a; | 346 | var fe = a; |
| 347 | while (i < n) : (i += 1) { | 347 | while (i < n) : (i += 1) { |
| ... | @@ -390,13 +390,12 @@ pub const Fe = struct { | ... | @@ -390,13 +390,12 @@ pub const Fe = struct { |
| 390 | const _11 = a.mul(a.sq()); | 390 | const _11 = a.mul(a.sq()); |
| 391 | const _1111 = _11.mul(_11.sq().sq()); | 391 | const _1111 = _11.mul(_11.sq().sq()); |
| 392 | const _11111111 = _1111.mul(_1111.sq().sq().sq().sq()); | 392 | const _11111111 = _1111.mul(_1111.sq().sq().sq().sq()); |
| 393 | var t = _11111111.sqn(2).mul(_11); | 393 | const u = _11111111.sqn(2).mul(_11); |
| 394 | const u = t; | 394 | const t = u.sqn(10).mul(u).sqn(10).mul(u); |
| 395 | t = t.sqn(10).mul(u).sqn(10).mul(u); | 395 | const t2 = t.sqn(30).mul(t); |
| 396 | t = t.sqn(30).mul(t); | 396 | const t3 = t2.sqn(60).mul(t2); |
| 397 | t = t.sqn(60).mul(t); | 397 | const t4 = t3.sqn(120).mul(t3).sqn(10).mul(u).sqn(3).mul(_11).sq(); |
| 398 | t = t.sqn(120).mul(t).sqn(10).mul(u).sqn(3).mul(_11).sq(); | 398 | return @bitCast(bool, @truncate(u1, ~(t4.toBytes()[1] & 1))); |
| 399 | return @bitCast(bool, @truncate(u1, ~(t.toBytes()[1] & 1))); | | |
| 400 | } | 399 | } |
| 401 | | 400 | |
| 402 | fn uncheckedSqrt(x2: Fe) Fe { | 401 | fn uncheckedSqrt(x2: Fe) Fe { |