mirror of
https://github.com/emmansun/gmsm.git
synced 2025-04-25 19:56:18 +08:00
202 lines
4.2 KiB
Go
202 lines
4.2 KiB
Go
![]() |
// Copyright 2021 The Go Authors. All rights reserved.
|
|||
|
// Use of this source code is governed by a BSD-style
|
|||
|
// license that can be found in the LICENSE file.
|
|||
|
// Code generated by addchain. DO NOT EDIT.
|
|||
|
package fiat
|
|||
|
|
|||
|
// Invert sets e = 1/x, and returns e.
|
|||
|
//
|
|||
|
// If x == 0, Invert returns e = 0.
|
|||
|
func (e *SM2P256OrderElement) Invert(x *SM2P256OrderElement) *SM2P256OrderElement {
|
|||
|
// Inversion is implemented as exponentiation with exponent p − 2.
|
|||
|
// The sequence of 41 multiplications and 253 squarings is derived from the
|
|||
|
// following addition chain generated with github.com/mmcloughlin/addchain v0.4.0.
|
|||
|
//
|
|||
|
// _10 = 2*1
|
|||
|
// _11 = 1 + _10
|
|||
|
// _100 = 1 + _11
|
|||
|
// _101 = 1 + _100
|
|||
|
// _111 = _10 + _101
|
|||
|
// _1001 = _10 + _111
|
|||
|
// _1101 = _100 + _1001
|
|||
|
// _1111 = _10 + _1101
|
|||
|
// _11110 = 2*_1111
|
|||
|
// _11111 = 1 + _11110
|
|||
|
// _111110 = 2*_11111
|
|||
|
// _111111 = 1 + _111110
|
|||
|
// _1111110 = 2*_111111
|
|||
|
// i20 = _1111110 << 6 + _1111110
|
|||
|
// x18 = i20 << 5 + _111111
|
|||
|
// x31 = x18 << 13 + i20 + 1
|
|||
|
// i42 = 2*x31
|
|||
|
// i44 = i42 << 2
|
|||
|
// i140 = ((i44 << 32 + i44) << 29 + i42) << 33
|
|||
|
// i150 = ((i44 + i140 + _111) << 4 + _111) << 3
|
|||
|
// i170 = ((1 + i150) << 11 + _1111) << 6 + _11111
|
|||
|
// i183 = ((i170 << 5 + _1101) << 3 + _11) << 3
|
|||
|
// i198 = ((1 + i183) << 7 + _111) << 5 + _11
|
|||
|
// i219 = ((i198 << 9 + _101) << 5 + _101) << 5
|
|||
|
// i231 = ((_1101 + i219) << 5 + _1001) << 4 + _1101
|
|||
|
// i244 = ((i231 << 2 + _11) << 7 + _111111) << 2
|
|||
|
// i262 = ((1 + i244) << 10 + _1001) << 5 + _111
|
|||
|
// i277 = ((i262 << 5 + _111) << 4 + _101) << 4
|
|||
|
// return ((_101 + i277) << 9 + _1001) << 5 + 1
|
|||
|
//
|
|||
|
var z = new(SM2P256OrderElement).Set(e)
|
|||
|
var t0 = new(SM2P256OrderElement)
|
|||
|
var t1 = new(SM2P256OrderElement)
|
|||
|
var t2 = new(SM2P256OrderElement)
|
|||
|
var t3 = new(SM2P256OrderElement)
|
|||
|
var t4 = new(SM2P256OrderElement)
|
|||
|
var t5 = new(SM2P256OrderElement)
|
|||
|
var t6 = new(SM2P256OrderElement)
|
|||
|
var t7 = new(SM2P256OrderElement)
|
|||
|
var t8 = new(SM2P256OrderElement)
|
|||
|
var t9 = new(SM2P256OrderElement)
|
|||
|
|
|||
|
t2.Square(x)
|
|||
|
t3.Mul(x, t2)
|
|||
|
t4.Mul(x, t3)
|
|||
|
t0.Mul(x, t4)
|
|||
|
t1.Mul(t2, t0)
|
|||
|
z.Mul(t2, t1)
|
|||
|
t4.Mul(t4, z)
|
|||
|
t6.Mul(t2, t4)
|
|||
|
t2.Square(t6)
|
|||
|
t5.Mul(x, t2)
|
|||
|
t2.Square(t5)
|
|||
|
t2.Mul(x, t2)
|
|||
|
t7.Square(t2)
|
|||
|
t8.Square(t7)
|
|||
|
for s := 1; s < 6; s++ {
|
|||
|
t8.Square(t8)
|
|||
|
}
|
|||
|
t7.Mul(t7, t8)
|
|||
|
t8.Square(t7)
|
|||
|
for s := 1; s < 5; s++ {
|
|||
|
t8.Square(t8)
|
|||
|
}
|
|||
|
t8.Mul(t2, t8)
|
|||
|
for s := 0; s < 13; s++ {
|
|||
|
t8.Square(t8)
|
|||
|
}
|
|||
|
t7.Mul(t7, t8)
|
|||
|
t7.Mul(x, t7)
|
|||
|
t8.Square(t7)
|
|||
|
t7.Square(t8)
|
|||
|
for s := 1; s < 2; s++ {
|
|||
|
t7.Square(t7)
|
|||
|
}
|
|||
|
t9.Square(t7)
|
|||
|
for s := 1; s < 32; s++ {
|
|||
|
t9.Square(t9)
|
|||
|
}
|
|||
|
t9.Mul(t7, t9)
|
|||
|
for s := 0; s < 29; s++ {
|
|||
|
t9.Square(t9)
|
|||
|
}
|
|||
|
t8.Mul(t8, t9)
|
|||
|
for s := 0; s < 33; s++ {
|
|||
|
t8.Square(t8)
|
|||
|
}
|
|||
|
t7.Mul(t7, t8)
|
|||
|
t7.Mul(t1, t7)
|
|||
|
for s := 0; s < 4; s++ {
|
|||
|
t7.Square(t7)
|
|||
|
}
|
|||
|
t7.Mul(t1, t7)
|
|||
|
for s := 0; s < 3; s++ {
|
|||
|
t7.Square(t7)
|
|||
|
}
|
|||
|
t7.Mul(x, t7)
|
|||
|
for s := 0; s < 11; s++ {
|
|||
|
t7.Square(t7)
|
|||
|
}
|
|||
|
t6.Mul(t6, t7)
|
|||
|
for s := 0; s < 6; s++ {
|
|||
|
t6.Square(t6)
|
|||
|
}
|
|||
|
t5.Mul(t5, t6)
|
|||
|
for s := 0; s < 5; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(t4, t5)
|
|||
|
for s := 0; s < 3; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(t3, t5)
|
|||
|
for s := 0; s < 3; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(x, t5)
|
|||
|
for s := 0; s < 7; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(t1, t5)
|
|||
|
for s := 0; s < 5; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(t3, t5)
|
|||
|
for s := 0; s < 9; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(t0, t5)
|
|||
|
for s := 0; s < 5; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(t0, t5)
|
|||
|
for s := 0; s < 5; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(t4, t5)
|
|||
|
for s := 0; s < 5; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t5.Mul(z, t5)
|
|||
|
for s := 0; s < 4; s++ {
|
|||
|
t5.Square(t5)
|
|||
|
}
|
|||
|
t4.Mul(t4, t5)
|
|||
|
for s := 0; s < 2; s++ {
|
|||
|
t4.Square(t4)
|
|||
|
}
|
|||
|
t3.Mul(t3, t4)
|
|||
|
for s := 0; s < 7; s++ {
|
|||
|
t3.Square(t3)
|
|||
|
}
|
|||
|
t2.Mul(t2, t3)
|
|||
|
for s := 0; s < 2; s++ {
|
|||
|
t2.Square(t2)
|
|||
|
}
|
|||
|
t2.Mul(x, t2)
|
|||
|
for s := 0; s < 10; s++ {
|
|||
|
t2.Square(t2)
|
|||
|
}
|
|||
|
t2.Mul(z, t2)
|
|||
|
for s := 0; s < 5; s++ {
|
|||
|
t2.Square(t2)
|
|||
|
}
|
|||
|
t2.Mul(t1, t2)
|
|||
|
for s := 0; s < 5; s++ {
|
|||
|
t2.Square(t2)
|
|||
|
}
|
|||
|
t1.Mul(t1, t2)
|
|||
|
for s := 0; s < 4; s++ {
|
|||
|
t1.Square(t1)
|
|||
|
}
|
|||
|
t1.Mul(t0, t1)
|
|||
|
for s := 0; s < 4; s++ {
|
|||
|
t1.Square(t1)
|
|||
|
}
|
|||
|
t0.Mul(t0, t1)
|
|||
|
for s := 0; s < 9; s++ {
|
|||
|
t0.Square(t0)
|
|||
|
}
|
|||
|
z.Mul(z, t0)
|
|||
|
for s := 0; s < 5; s++ {
|
|||
|
z.Square(z)
|
|||
|
}
|
|||
|
z.Mul(x, z)
|
|||
|
return e.Set(z)
|
|||
|
}
|