gmsm/internal/sm2ec/fiat/sm2p256scalar_invert.go

202 lines
4.2 KiB
Go
Raw Normal View History

// 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)
}