(out, z *fieldElement)
| 858 | } |
| 859 | |
| 860 | func feInvert(out, z *fieldElement) { |
| 861 | var t0, t1, t2, t3 fieldElement |
| 862 | var i int |
| 863 | |
| 864 | feSquare(&t0, z) // 2^1 |
| 865 | feSquare(&t1, &t0) // 2^2 |
| 866 | for i = 1; i < 2; i++ { // 2^3 |
| 867 | feSquare(&t1, &t1) |
| 868 | } |
| 869 | feMul(&t1, z, &t1) // 2^3 + 2^0 |
| 870 | feMul(&t0, &t0, &t1) // 2^3 + 2^1 + 2^0 |
| 871 | feSquare(&t2, &t0) // 2^4 + 2^2 + 2^1 |
| 872 | feMul(&t1, &t1, &t2) // 2^4 + 2^3 + 2^2 + 2^1 + 2^0 |
| 873 | feSquare(&t2, &t1) // 5,4,3,2,1 |
| 874 | for i = 1; i < 5; i++ { // 9,8,7,6,5 |
| 875 | feSquare(&t2, &t2) |
| 876 | } |
| 877 | feMul(&t1, &t2, &t1) // 9,8,7,6,5,4,3,2,1,0 |
| 878 | feSquare(&t2, &t1) // 10..1 |
| 879 | for i = 1; i < 10; i++ { // 19..10 |
| 880 | feSquare(&t2, &t2) |
| 881 | } |
| 882 | feMul(&t2, &t2, &t1) // 19..0 |
| 883 | feSquare(&t3, &t2) // 20..1 |
| 884 | for i = 1; i < 20; i++ { // 39..20 |
| 885 | feSquare(&t3, &t3) |
| 886 | } |
| 887 | feMul(&t2, &t3, &t2) // 39..0 |
| 888 | feSquare(&t2, &t2) // 40..1 |
| 889 | for i = 1; i < 10; i++ { // 49..10 |
| 890 | feSquare(&t2, &t2) |
| 891 | } |
| 892 | feMul(&t1, &t2, &t1) // 49..0 |
| 893 | feSquare(&t2, &t1) // 50..1 |
| 894 | for i = 1; i < 50; i++ { // 99..50 |
| 895 | feSquare(&t2, &t2) |
| 896 | } |
| 897 | feMul(&t2, &t2, &t1) // 99..0 |
| 898 | feSquare(&t3, &t2) // 100..1 |
| 899 | for i = 1; i < 100; i++ { // 199..100 |
| 900 | feSquare(&t3, &t3) |
| 901 | } |
| 902 | feMul(&t2, &t3, &t2) // 199..0 |
| 903 | feSquare(&t2, &t2) // 200..1 |
| 904 | for i = 1; i < 50; i++ { // 249..50 |
| 905 | feSquare(&t2, &t2) |
| 906 | } |
| 907 | feMul(&t1, &t2, &t1) // 249..0 |
| 908 | feSquare(&t1, &t1) // 250..1 |
| 909 | for i = 1; i < 5; i++ { // 254..5 |
| 910 | feSquare(&t1, &t1) |
| 911 | } |
| 912 | feMul(out, &t1, &t0) // 254..5,3,1,0 |
| 913 | } |
| 914 | |
| 915 | func fePow22523(out, z *fieldElement) { |
| 916 | var t0, t1, t2 fieldElement |
no test coverage detected