Source File
edwards25519.go
Belonging Package
crypto/ed25519/internal/edwards25519
package edwards25519
import
type FieldElement [10]int32
var zero FieldElement
func ( *FieldElement) {
copy([:], zero[:])
}
func ( *FieldElement) {
FeZero()
[0] = 1
}
func (, , *FieldElement) {
[0] = [0] + [0]
[1] = [1] + [1]
[2] = [2] + [2]
[3] = [3] + [3]
[4] = [4] + [4]
[5] = [5] + [5]
[6] = [6] + [6]
[7] = [7] + [7]
[8] = [8] + [8]
[9] = [9] + [9]
}
func (, , *FieldElement) {
[0] = [0] - [0]
[1] = [1] - [1]
[2] = [2] - [2]
[3] = [3] - [3]
[4] = [4] - [4]
[5] = [5] - [5]
[6] = [6] - [6]
[7] = [7] - [7]
[8] = [8] - [8]
[9] = [9] - [9]
}
func (, *FieldElement) {
copy([:], [:])
}
func (, *FieldElement, int32) {
= -
[0] ^= & ([0] ^ [0])
[1] ^= & ([1] ^ [1])
[2] ^= & ([2] ^ [2])
[3] ^= & ([3] ^ [3])
[4] ^= & ([4] ^ [4])
[5] ^= & ([5] ^ [5])
[6] ^= & ([6] ^ [6])
[7] ^= & ([7] ^ [7])
[8] ^= & ([8] ^ [8])
[9] ^= & ([9] ^ [9])
}
func ( []byte) int64 {
var int64
= int64([0])
|= int64([1]) << 8
|= int64([2]) << 16
return
}
func ( []byte) int64 {
var int64
= int64([0])
|= int64([1]) << 8
|= int64([2]) << 16
|= int64([3]) << 24
return
}
func ( *FieldElement, *[32]byte) {
:= load4([:])
:= load3([4:]) << 6
:= load3([7:]) << 5
:= load3([10:]) << 3
:= load3([13:]) << 2
:= load4([16:])
:= load3([20:]) << 7
:= load3([23:]) << 5
:= load3([26:]) << 4
:= (load3([29:]) & 8388607) << 2
FeCombine(, , , , , , , , , , )
}
func ( *[32]byte, *FieldElement) {
var [10]int32
:= (19*[9] + (1 << 24)) >> 25
= ([0] + ) >> 26
= ([1] + ) >> 25
= ([2] + ) >> 26
= ([3] + ) >> 25
= ([4] + ) >> 26
= ([5] + ) >> 25
= ([6] + ) >> 26
= ([7] + ) >> 25
= ([8] + ) >> 26
= ([9] + ) >> 25
[0] = [0] >> 26
[1] += [0]
[0] -= [0] << 26
[1] = [1] >> 25
[2] += [1]
[1] -= [1] << 25
[2] = [2] >> 26
[3] += [2]
[2] -= [2] << 26
[3] = [3] >> 25
[4] += [3]
[3] -= [3] << 25
[4] = [4] >> 26
[5] += [4]
[4] -= [4] << 26
[5] = [5] >> 25
[6] += [5]
[5] -= [5] << 25
[6] = [6] >> 26
[7] += [6]
[6] -= [6] << 26
[7] = [7] >> 25
[8] += [7]
[7] -= [7] << 25
[8] = [8] >> 26
[9] += [8]
[8] -= [8] << 26
[9] = [9] >> 25
[0] = byte([0] >> 0)
[1] = byte([0] >> 8)
[2] = byte([0] >> 16)
[3] = byte(([0] >> 24) | ([1] << 2))
[4] = byte([1] >> 6)
[5] = byte([1] >> 14)
[6] = byte(([1] >> 22) | ([2] << 3))
[7] = byte([2] >> 5)
[8] = byte([2] >> 13)
[9] = byte(([2] >> 21) | ([3] << 5))
[10] = byte([3] >> 3)
[11] = byte([3] >> 11)
[12] = byte(([3] >> 19) | ([4] << 6))
[13] = byte([4] >> 2)
[14] = byte([4] >> 10)
[15] = byte([4] >> 18)
[16] = byte([5] >> 0)
[17] = byte([5] >> 8)
[18] = byte([5] >> 16)
[19] = byte(([5] >> 24) | ([6] << 1))
[20] = byte([6] >> 7)
[21] = byte([6] >> 15)
[22] = byte(([6] >> 23) | ([7] << 3))
[23] = byte([7] >> 5)
[24] = byte([7] >> 13)
[25] = byte(([7] >> 21) | ([8] << 4))
[26] = byte([8] >> 4)
[27] = byte([8] >> 12)
[28] = byte(([8] >> 20) | ([9] << 6))
[29] = byte([9] >> 2)
[30] = byte([9] >> 10)
[31] = byte([9] >> 18)
}
func ( *FieldElement) byte {
var [32]byte
FeToBytes(&, )
return [0] & 1
}
func ( *FieldElement) int32 {
var [32]byte
FeToBytes(&, )
var uint8
for , := range {
|=
}
|= >> 4
|= >> 2
|= >> 1
return int32( & 1)
}
func (, *FieldElement) {
[0] = -[0]
[1] = -[1]
[2] = -[2]
[3] = -[3]
[4] = -[4]
[5] = -[5]
[6] = -[6]
[7] = -[7]
[8] = -[8]
[9] = -[9]
}
func ( *FieldElement, , , , , , , , , , int64) {
var , , , , , , , , , int64
= ( + (1 << 25)) >> 26
+=
-= << 26
= ( + (1 << 25)) >> 26
+=
= ( + (1 << 24)) >> 25
+=
-= << 25
= ( + (1 << 24)) >> 25
+=
= ( + (1 << 25)) >> 26
+=
-= << 26
= ( + (1 << 25)) >> 26
+=
= ( + (1 << 24)) >> 25
+=
-= << 25
= ( + (1 << 24)) >> 25
+=
= ( + (1 << 25)) >> 26
+=
-= << 26
= ( + (1 << 25)) >> 26
+=
= ( + (1 << 24)) >> 25
+= * 19
= ( + (1 << 25)) >> 26
+=
func (, , *FieldElement) {
:= int64([0])
:= int64([1])
:= int64([2])
:= int64([3])
:= int64([4])
:= int64([5])
:= int64([6])
:= int64([7])
:= int64([8])
:= int64([9])
:= int64(2 * [1])
:= int64(2 * [3])
:= int64(2 * [5])
:= int64(2 * [7])
:= int64(2 * [9])
:= int64([0])
:= int64([1])
:= int64([2])
:= int64([3])
:= int64([4])
:= int64([5])
:= int64([6])
:= int64([7])
:= int64([8])
:= int64([9])
:= int64(19 * [1]) /* 1.4*2^29 */
:= int64(19 * [2]) /* 1.4*2^30; still ok */
:= int64(19 * [3])
:= int64(19 * [4])
:= int64(19 * [5])
:= int64(19 * [6])
:= int64(19 * [7])
:= int64(19 * [8])
:= int64(19 * [9])
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
FeCombine(, , , , , , , , , , )
}
func ( *FieldElement) (, , , , , , , , , int64) {
:= int64([0])
:= int64([1])
:= int64([2])
:= int64([3])
:= int64([4])
:= int64([5])
:= int64([6])
:= int64([7])
:= int64([8])
:= int64([9])
:= int64(2 * [0])
:= int64(2 * [1])
:= int64(2 * [2])
:= int64(2 * [3])
:= int64(2 * [4])
:= int64(2 * [5])
:= int64(2 * [6])
:= int64(2 * [7])
:= 38 * // 1.31*2^30
:= 19 * // 1.31*2^30
:= 38 * // 1.31*2^30
:= 19 * // 1.31*2^30
:= 38 * // 1.31*2^30
= * + * + * + * + * + *
= * + * + * + * + *
= * + * + * + * + * + *
= * + * + * + * + *
= * + * + * + * + * + *
= * + * + * + * + *
= * + * + * + * + * + *
= * + * + * + * + *
= * + * + * + * + * + *
= * + * + * + * + *
return
}
func (, *FieldElement) {
, , , , , , , , , := feSquare()
FeCombine(, , , , , , , , , , )
}
func (, *FieldElement) {
, , , , , , , , , := feSquare()
+=
+=
+=
+=
+=
+=
+=
+=
+=
+=
FeCombine(, , , , , , , , , , )
}
func (, *FieldElement) {
var , , , FieldElement
var int
FeSquare(&, ) // 2^1
FeSquare(&, &) // 2^2
for = 1; < 2; ++ { // 2^3
FeSquare(&, &)
}
FeMul(&, , &) // 2^3 + 2^0
FeMul(&, &, &) // 2^3 + 2^1 + 2^0
FeSquare(&, &) // 2^4 + 2^2 + 2^1
FeMul(&, &, &) // 2^4 + 2^3 + 2^2 + 2^1 + 2^0
FeSquare(&, &) // 5,4,3,2,1
for = 1; < 5; ++ { // 9,8,7,6,5
FeSquare(&, &)
}
FeMul(&, &, &) // 9,8,7,6,5,4,3,2,1,0
FeSquare(&, &) // 10..1
for = 1; < 10; ++ { // 19..10
FeSquare(&, &)
}
FeMul(&, &, &) // 19..0
FeSquare(&, &) // 20..1
for = 1; < 20; ++ { // 39..20
FeSquare(&, &)
}
FeMul(&, &, &) // 39..0
FeSquare(&, &) // 40..1
for = 1; < 10; ++ { // 49..10
FeSquare(&, &)
}
FeMul(&, &, &) // 49..0
FeSquare(&, &) // 50..1
for = 1; < 50; ++ { // 99..50
FeSquare(&, &)
}
FeMul(&, &, &) // 99..0
FeSquare(&, &) // 100..1
for = 1; < 100; ++ { // 199..100
FeSquare(&, &)
}
FeMul(&, &, &) // 199..0
FeSquare(&, &) // 200..1
for = 1; < 50; ++ { // 249..50
FeSquare(&, &)
}
FeMul(&, &, &) // 249..0
FeSquare(&, &) // 250..1
for = 1; < 5; ++ { // 254..5
FeSquare(&, &)
}
FeMul(, &, &) // 254..5,3,1,0
}
func (, *FieldElement) {
var , , FieldElement
var int
FeSquare(&, )
for = 1; < 1; ++ {
FeSquare(&, &)
}
FeSquare(&, &)
for = 1; < 2; ++ {
FeSquare(&, &)
}
FeMul(&, , &)
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 1; ++ {
FeSquare(&, &)
}
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 5; ++ {
FeSquare(&, &)
}
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 10; ++ {
FeSquare(&, &)
}
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 20; ++ {
FeSquare(&, &)
}
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 10; ++ {
FeSquare(&, &)
}
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 50; ++ {
FeSquare(&, &)
}
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 100; ++ {
FeSquare(&, &)
}
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 50; ++ {
FeSquare(&, &)
}
FeMul(&, &, &)
FeSquare(&, &)
for = 1; < 2; ++ {
FeSquare(&, &)
}
FeMul(, &, )
}
type ProjectiveGroupElement struct {
X, Y, Z FieldElement
}
type ExtendedGroupElement struct {
X, Y, Z, T FieldElement
}
type CompletedGroupElement struct {
X, Y, Z, T FieldElement
}
type PreComputedGroupElement struct {
yPlusX, yMinusX, xy2d FieldElement
}
type CachedGroupElement struct {
yPlusX, yMinusX, Z, T2d FieldElement
}
func ( *ProjectiveGroupElement) () {
FeZero(&.X)
FeOne(&.Y)
FeOne(&.Z)
}
func ( *ProjectiveGroupElement) ( *CompletedGroupElement) {
var FieldElement
FeSquare(&.X, &.X)
FeSquare(&.Z, &.Y)
FeSquare2(&.T, &.Z)
FeAdd(&.Y, &.X, &.Y)
FeSquare(&, &.Y)
FeAdd(&.Y, &.Z, &.X)
FeSub(&.Z, &.Z, &.X)
FeSub(&.X, &, &.Y)
FeSub(&.T, &.T, &.Z)
}
func ( *ProjectiveGroupElement) ( *[32]byte) {
var , , FieldElement
FeInvert(&, &.Z)
FeMul(&, &.X, &)
FeMul(&, &.Y, &)
FeToBytes(, &)
[31] ^= FeIsNegative(&) << 7
}
func ( *ExtendedGroupElement) () {
FeZero(&.X)
FeOne(&.Y)
FeOne(&.Z)
FeZero(&.T)
}
func ( *ExtendedGroupElement) ( *CompletedGroupElement) {
var ProjectiveGroupElement
.ToProjective(&)
.Double()
}
func ( *ExtendedGroupElement) ( *CachedGroupElement) {
FeAdd(&.yPlusX, &.Y, &.X)
FeSub(&.yMinusX, &.Y, &.X)
FeCopy(&.Z, &.Z)
FeMul(&.T2d, &.T, &d2)
}
func ( *ExtendedGroupElement) ( *ProjectiveGroupElement) {
FeCopy(&.X, &.X)
FeCopy(&.Y, &.Y)
FeCopy(&.Z, &.Z)
}
func ( *ExtendedGroupElement) ( *[32]byte) {
var , , FieldElement
FeInvert(&, &.Z)
FeMul(&, &.X, &)
FeMul(&, &.Y, &)
FeToBytes(, &)
[31] ^= FeIsNegative(&) << 7
}
func ( *ExtendedGroupElement) ( *[32]byte) bool {
var , , , , FieldElement
FeFromBytes(&.Y, )
FeOne(&.Z)
FeSquare(&, &.Y)
FeMul(&, &, &d)
FeSub(&, &, &.Z) // u = y^2-1
FeAdd(&, &, &.Z) // v = dy^2+1
FeSquare(&, &)
FeMul(&, &, &) // v3 = v^3
FeSquare(&.X, &)
FeMul(&.X, &.X, &)
FeMul(&.X, &.X, &) // x = uv^7
fePow22523(&.X, &.X) // x = (uv^7)^((q-5)/8)
FeMul(&.X, &.X, &)
FeMul(&.X, &.X, &) // x = uv^3(uv^7)^((q-5)/8)
var , [32]byte
FeSquare(&, &.X)
FeMul(&, &, &)
FeSub(&, &, &) // vx^2-u
if FeIsNonZero(&) == 1 {
FeAdd(&, &, &) // vx^2+u
if FeIsNonZero(&) == 1 {
return false
}
FeMul(&.X, &.X, &SqrtM1)
FeToBytes(&, &.X)
for , := range {
[31-] =
}
}
if FeIsNegative(&.X) != ([31] >> 7) {
FeNeg(&.X, &.X)
}
FeMul(&.T, &.X, &.Y)
return true
}
func ( *CompletedGroupElement) ( *ProjectiveGroupElement) {
FeMul(&.X, &.X, &.T)
FeMul(&.Y, &.Y, &.Z)
FeMul(&.Z, &.Z, &.T)
}
func ( *CompletedGroupElement) ( *ExtendedGroupElement) {
FeMul(&.X, &.X, &.T)
FeMul(&.Y, &.Y, &.Z)
FeMul(&.Z, &.Z, &.T)
FeMul(&.T, &.X, &.Y)
}
func ( *PreComputedGroupElement) () {
FeOne(&.yPlusX)
FeOne(&.yMinusX)
FeZero(&.xy2d)
}
func ( *CompletedGroupElement, *ExtendedGroupElement, *CachedGroupElement) {
var FieldElement
FeAdd(&.X, &.Y, &.X)
FeSub(&.Y, &.Y, &.X)
FeMul(&.Z, &.X, &.yPlusX)
FeMul(&.Y, &.Y, &.yMinusX)
FeMul(&.T, &.T2d, &.T)
FeMul(&.X, &.Z, &.Z)
FeAdd(&, &.X, &.X)
FeSub(&.X, &.Z, &.Y)
FeAdd(&.Y, &.Z, &.Y)
FeAdd(&.Z, &, &.T)
FeSub(&.T, &, &.T)
}
func ( *CompletedGroupElement, *ExtendedGroupElement, *CachedGroupElement) {
var FieldElement
FeAdd(&.X, &.Y, &.X)
FeSub(&.Y, &.Y, &.X)
FeMul(&.Z, &.X, &.yMinusX)
FeMul(&.Y, &.Y, &.yPlusX)
FeMul(&.T, &.T2d, &.T)
FeMul(&.X, &.Z, &.Z)
FeAdd(&, &.X, &.X)
FeSub(&.X, &.Z, &.Y)
FeAdd(&.Y, &.Z, &.Y)
FeSub(&.Z, &, &.T)
FeAdd(&.T, &, &.T)
}
func ( *CompletedGroupElement, *ExtendedGroupElement, *PreComputedGroupElement) {
var FieldElement
FeAdd(&.X, &.Y, &.X)
FeSub(&.Y, &.Y, &.X)
FeMul(&.Z, &.X, &.yPlusX)
FeMul(&.Y, &.Y, &.yMinusX)
FeMul(&.T, &.xy2d, &.T)
FeAdd(&, &.Z, &.Z)
FeSub(&.X, &.Z, &.Y)
FeAdd(&.Y, &.Z, &.Y)
FeAdd(&.Z, &, &.T)
FeSub(&.T, &, &.T)
}
func ( *CompletedGroupElement, *ExtendedGroupElement, *PreComputedGroupElement) {
var FieldElement
FeAdd(&.X, &.Y, &.X)
FeSub(&.Y, &.Y, &.X)
FeMul(&.Z, &.X, &.yMinusX)
FeMul(&.Y, &.Y, &.yPlusX)
FeMul(&.T, &.xy2d, &.T)
FeAdd(&, &.Z, &.Z)
FeSub(&.X, &.Z, &.Y)
FeAdd(&.Y, &.Z, &.Y)
FeSub(&.Z, &, &.T)
FeAdd(&.T, &, &.T)
}
func ( *[256]int8, *[32]byte) {
for := range {
[] = int8(1 & ([>>3] >> uint(&7)))
}
for := range {
if [] != 0 {
for := 1; <= 6 && + < 256; ++ {
if [+] != 0 {
if []+([+]<<uint()) <= 15 {
[] += [+] << uint()
[+] = 0
} else if []-([+]<<uint()) >= -15 {
[] -= [+] << uint()
for := + ; < 256; ++ {
if [] == 0 {
[] = 1
break
}
[] = 0
}
} else {
break
}
}
}
}
}
}
func ( *ProjectiveGroupElement, *[32]byte, *ExtendedGroupElement, *[32]byte) {
var , [256]int8
var [8]CachedGroupElement // A,3A,5A,7A,9A,11A,13A,15A
var CompletedGroupElement
var , ExtendedGroupElement
var int
slide(&, )
slide(&, )
.ToCached(&[0])
.Double(&)
.ToExtended(&)
for := 0; < 7; ++ {
geAdd(&, &, &[])
.ToExtended(&)
.ToCached(&[+1])
}
.Zero()
for = 255; >= 0; -- {
if [] != 0 || [] != 0 {
break
}
}
for ; >= 0; -- {
.Double(&)
if [] > 0 {
.ToExtended(&)
geAdd(&, &, &[[]/2])
} else if [] < 0 {
.ToExtended(&)
geSub(&, &, &[(-[])/2])
}
if [] > 0 {
.ToExtended(&)
geMixedAdd(&, &, &bi[[]/2])
} else if [] < 0 {
.ToExtended(&)
geMixedSub(&, &, &bi[(-[])/2])
}
.ToProjective()
}
}
func ( int32) int32 {
return ( >> 31) & 1
}
func (, *PreComputedGroupElement, int32) {
FeCMove(&.yPlusX, &.yPlusX, )
FeCMove(&.yMinusX, &.yMinusX, )
FeCMove(&.xy2d, &.xy2d, )
}
func ( *PreComputedGroupElement, int32, int32) {
var PreComputedGroupElement
:= negative()
:= - (((-) & ) << 1)
.Zero()
for := int32(0); < 8; ++ {
PreComputedGroupElementCMove(, &base[][], equal(, +1))
}
FeCopy(&.yPlusX, &.yMinusX)
FeCopy(&.yMinusX, &.yPlusX)
FeNeg(&.xy2d, &.xy2d)
PreComputedGroupElementCMove(, &, )
}
func ( *ExtendedGroupElement, *[32]byte) {
var [64]int8
for , := range {
[2*] = int8( & 15)
[2*+1] = int8(( >> 4) & 15)
}
:= int8(0)
for := 0; < 63; ++ {
[] +=
= ([] + 8) >> 4
[] -= << 4
}
.Zero()
var PreComputedGroupElement
var CompletedGroupElement
for := int32(1); < 64; += 2 {
selectPoint(&, /2, int32([]))
geMixedAdd(&, , &)
.ToExtended()
}
var ProjectiveGroupElement
.Double(&)
.ToProjective(&)
.Double(&)
.ToProjective(&)
.Double(&)
.ToProjective(&)
.Double(&)
.ToExtended()
for := int32(0); < 64; += 2 {
selectPoint(&, /2, int32([]))
geMixedAdd(&, , &)
.ToExtended()
}
}
func (, , , *[32]byte) {
:= 2097151 & load3([:])
:= 2097151 & (load4([2:]) >> 5)
:= 2097151 & (load3([5:]) >> 2)
:= 2097151 & (load4([7:]) >> 7)
:= 2097151 & (load4([10:]) >> 4)
:= 2097151 & (load3([13:]) >> 1)
:= 2097151 & (load4([15:]) >> 6)
:= 2097151 & (load3([18:]) >> 3)
:= 2097151 & load3([21:])
:= 2097151 & (load4([23:]) >> 5)
:= 2097151 & (load3([26:]) >> 2)
:= (load4([28:]) >> 7)
:= 2097151 & load3([:])
:= 2097151 & (load4([2:]) >> 5)
:= 2097151 & (load3([5:]) >> 2)
:= 2097151 & (load4([7:]) >> 7)
:= 2097151 & (load4([10:]) >> 4)
:= 2097151 & (load3([13:]) >> 1)
:= 2097151 & (load4([15:]) >> 6)
:= 2097151 & (load3([18:]) >> 3)
:= 2097151 & load3([21:])
:= 2097151 & (load4([23:]) >> 5)
:= 2097151 & (load3([26:]) >> 2)
:= (load4([28:]) >> 7)
:= 2097151 & load3([:])
:= 2097151 & (load4([2:]) >> 5)
:= 2097151 & (load3([5:]) >> 2)
:= 2097151 & (load4([7:]) >> 7)
:= 2097151 & (load4([10:]) >> 4)
:= 2097151 & (load3([13:]) >> 1)
:= 2097151 & (load4([15:]) >> 6)
:= 2097151 & (load3([18:]) >> 3)
:= 2097151 & load3([21:])
:= 2097151 & (load4([23:]) >> 5)
:= 2097151 & (load3([26:]) >> 2)
:= (load4([28:]) >> 7)
var [23]int64
:= + *
:= + * + *
:= + * + * + *
:= + * + * + * + *
:= + * + * + * + * + *
:= + * + * + * + * + * + *
:= + * + * + * + * + * + * + *
:= + * + * + * + * + * + * + * + *
:= + * + * + * + * + * + * + * + * + *
:= + * + * + * + * + * + * + * + * + * + *
:= + * + * + * + * + * + * + * + * + * + * + *
:= + * + * + * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + * + *
:= * + * + * + * + * + * + *
:= * + * + * + * + * + *
:= * + * + * + * + *
:= * + * + * + *
:= * + * + *
:= * + *
:= *
:= int64(0)
[0] = ( + (1 << 20)) >> 21
+= [0]
-= [0] << 21
[2] = ( + (1 << 20)) >> 21
+= [2]
-= [2] << 21
[4] = ( + (1 << 20)) >> 21
+= [4]
-= [4] << 21
[6] = ( + (1 << 20)) >> 21
+= [6]
-= [6] << 21
[8] = ( + (1 << 20)) >> 21
+= [8]
-= [8] << 21
[10] = ( + (1 << 20)) >> 21
+= [10]
-= [10] << 21
[12] = ( + (1 << 20)) >> 21
+= [12]
-= [12] << 21
[14] = ( + (1 << 20)) >> 21
+= [14]
-= [14] << 21
[16] = ( + (1 << 20)) >> 21
+= [16]
-= [16] << 21
[18] = ( + (1 << 20)) >> 21
+= [18]
-= [18] << 21
[20] = ( + (1 << 20)) >> 21
+= [20]
-= [20] << 21
[22] = ( + (1 << 20)) >> 21
+= [22]
-= [22] << 21
[1] = ( + (1 << 20)) >> 21
+= [1]
-= [1] << 21
[3] = ( + (1 << 20)) >> 21
+= [3]
-= [3] << 21
[5] = ( + (1 << 20)) >> 21
+= [5]
-= [5] << 21
[7] = ( + (1 << 20)) >> 21
+= [7]
-= [7] << 21
[9] = ( + (1 << 20)) >> 21
+= [9]
-= [9] << 21
[11] = ( + (1 << 20)) >> 21
+= [11]
-= [11] << 21
[13] = ( + (1 << 20)) >> 21
+= [13]
-= [13] << 21
[15] = ( + (1 << 20)) >> 21
+= [15]
-= [15] << 21
[17] = ( + (1 << 20)) >> 21
+= [17]
-= [17] << 21
[19] = ( + (1 << 20)) >> 21
+= [19]
-= [19] << 21
[21] = ( + (1 << 20)) >> 21
+= [21]
-= [21] << 21
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
[6] = ( + (1 << 20)) >> 21
+= [6]
-= [6] << 21
[8] = ( + (1 << 20)) >> 21
+= [8]
-= [8] << 21
[10] = ( + (1 << 20)) >> 21
+= [10]
-= [10] << 21
[12] = ( + (1 << 20)) >> 21
+= [12]
-= [12] << 21
[14] = ( + (1 << 20)) >> 21
+= [14]
-= [14] << 21
[16] = ( + (1 << 20)) >> 21
+= [16]
-= [16] << 21
[7] = ( + (1 << 20)) >> 21
+= [7]
-= [7] << 21
[9] = ( + (1 << 20)) >> 21
+= [9]
-= [9] << 21
[11] = ( + (1 << 20)) >> 21
+= [11]
-= [11] << 21
[13] = ( + (1 << 20)) >> 21
+= [13]
-= [13] << 21
[15] = ( + (1 << 20)) >> 21
+= [15]
-= [15] << 21
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
[0] = ( + (1 << 20)) >> 21
+= [0]
-= [0] << 21
[2] = ( + (1 << 20)) >> 21
+= [2]
-= [2] << 21
[4] = ( + (1 << 20)) >> 21
+= [4]
-= [4] << 21
[6] = ( + (1 << 20)) >> 21
+= [6]
-= [6] << 21
[8] = ( + (1 << 20)) >> 21
+= [8]
-= [8] << 21
[10] = ( + (1 << 20)) >> 21
+= [10]
-= [10] << 21
[1] = ( + (1 << 20)) >> 21
+= [1]
-= [1] << 21
[3] = ( + (1 << 20)) >> 21
+= [3]
-= [3] << 21
[5] = ( + (1 << 20)) >> 21
+= [5]
-= [5] << 21
[7] = ( + (1 << 20)) >> 21
+= [7]
-= [7] << 21
[9] = ( + (1 << 20)) >> 21
+= [9]
-= [9] << 21
[11] = ( + (1 << 20)) >> 21
+= [11]
-= [11] << 21
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
[0] = >> 21
+= [0]
-= [0] << 21
[1] = >> 21
+= [1]
-= [1] << 21
[2] = >> 21
+= [2]
-= [2] << 21
[3] = >> 21
+= [3]
-= [3] << 21
[4] = >> 21
+= [4]
-= [4] << 21
[5] = >> 21
+= [5]
-= [5] << 21
[6] = >> 21
+= [6]
-= [6] << 21
[7] = >> 21
+= [7]
-= [7] << 21
[8] = >> 21
+= [8]
-= [8] << 21
[9] = >> 21
+= [9]
-= [9] << 21
[10] = >> 21
+= [10]
-= [10] << 21
[11] = >> 21
+= [11]
-= [11] << 21
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
[0] = >> 21
+= [0]
-= [0] << 21
[1] = >> 21
+= [1]
-= [1] << 21
[2] = >> 21
+= [2]
-= [2] << 21
[3] = >> 21
+= [3]
-= [3] << 21
[4] = >> 21
+= [4]
-= [4] << 21
[5] = >> 21
+= [5]
-= [5] << 21
[6] = >> 21
+= [6]
-= [6] << 21
[7] = >> 21
+= [7]
-= [7] << 21
[8] = >> 21
+= [8]
-= [8] << 21
[9] = >> 21
+= [9]
-= [9] << 21
[10] = >> 21
+= [10]
-= [10] << 21
[0] = byte( >> 0)
[1] = byte( >> 8)
[2] = byte(( >> 16) | ( << 5))
[3] = byte( >> 3)
[4] = byte( >> 11)
[5] = byte(( >> 19) | ( << 2))
[6] = byte( >> 6)
[7] = byte(( >> 14) | ( << 7))
[8] = byte( >> 1)
[9] = byte( >> 9)
[10] = byte(( >> 17) | ( << 4))
[11] = byte( >> 4)
[12] = byte( >> 12)
[13] = byte(( >> 20) | ( << 1))
[14] = byte( >> 7)
[15] = byte(( >> 15) | ( << 6))
[16] = byte( >> 2)
[17] = byte( >> 10)
[18] = byte(( >> 18) | ( << 3))
[19] = byte( >> 5)
[20] = byte( >> 13)
[21] = byte( >> 0)
[22] = byte( >> 8)
[23] = byte(( >> 16) | ( << 5))
[24] = byte( >> 3)
[25] = byte( >> 11)
[26] = byte(( >> 19) | ( << 2))
[27] = byte( >> 6)
[28] = byte(( >> 14) | ( << 7))
[29] = byte( >> 1)
[30] = byte( >> 9)
[31] = byte( >> 17)
}
func ( *[32]byte, *[64]byte) {
:= 2097151 & load3([:])
:= 2097151 & (load4([2:]) >> 5)
:= 2097151 & (load3([5:]) >> 2)
:= 2097151 & (load4([7:]) >> 7)
:= 2097151 & (load4([10:]) >> 4)
:= 2097151 & (load3([13:]) >> 1)
:= 2097151 & (load4([15:]) >> 6)
:= 2097151 & (load3([18:]) >> 3)
:= 2097151 & load3([21:])
:= 2097151 & (load4([23:]) >> 5)
:= 2097151 & (load3([26:]) >> 2)
:= 2097151 & (load4([28:]) >> 7)
:= 2097151 & (load4([31:]) >> 4)
:= 2097151 & (load3([34:]) >> 1)
:= 2097151 & (load4([36:]) >> 6)
:= 2097151 & (load3([39:]) >> 3)
:= 2097151 & load3([42:])
:= 2097151 & (load4([44:]) >> 5)
:= 2097151 & (load3([47:]) >> 2)
:= 2097151 & (load4([49:]) >> 7)
:= 2097151 & (load4([52:]) >> 4)
:= 2097151 & (load3([55:]) >> 1)
:= 2097151 & (load4([57:]) >> 6)
:= (load4([60:]) >> 3)
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
var [17]int64
[6] = ( + (1 << 20)) >> 21
+= [6]
-= [6] << 21
[8] = ( + (1 << 20)) >> 21
+= [8]
-= [8] << 21
[10] = ( + (1 << 20)) >> 21
+= [10]
-= [10] << 21
[12] = ( + (1 << 20)) >> 21
+= [12]
-= [12] << 21
[14] = ( + (1 << 20)) >> 21
+= [14]
-= [14] << 21
[16] = ( + (1 << 20)) >> 21
+= [16]
-= [16] << 21
[7] = ( + (1 << 20)) >> 21
+= [7]
-= [7] << 21
[9] = ( + (1 << 20)) >> 21
+= [9]
-= [9] << 21
[11] = ( + (1 << 20)) >> 21
+= [11]
-= [11] << 21
[13] = ( + (1 << 20)) >> 21
+= [13]
-= [13] << 21
[15] = ( + (1 << 20)) >> 21
+= [15]
-= [15] << 21
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
[0] = ( + (1 << 20)) >> 21
+= [0]
-= [0] << 21
[2] = ( + (1 << 20)) >> 21
+= [2]
-= [2] << 21
[4] = ( + (1 << 20)) >> 21
+= [4]
-= [4] << 21
[6] = ( + (1 << 20)) >> 21
+= [6]
-= [6] << 21
[8] = ( + (1 << 20)) >> 21
+= [8]
-= [8] << 21
[10] = ( + (1 << 20)) >> 21
+= [10]
-= [10] << 21
[1] = ( + (1 << 20)) >> 21
+= [1]
-= [1] << 21
[3] = ( + (1 << 20)) >> 21
+= [3]
-= [3] << 21
[5] = ( + (1 << 20)) >> 21
+= [5]
-= [5] << 21
[7] = ( + (1 << 20)) >> 21
+= [7]
-= [7] << 21
[9] = ( + (1 << 20)) >> 21
+= [9]
-= [9] << 21
[11] = ( + (1 << 20)) >> 21
+= [11]
-= [11] << 21
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
[0] = >> 21
+= [0]
-= [0] << 21
[1] = >> 21
+= [1]
-= [1] << 21
[2] = >> 21
+= [2]
-= [2] << 21
[3] = >> 21
+= [3]
-= [3] << 21
[4] = >> 21
+= [4]
-= [4] << 21
[5] = >> 21
+= [5]
-= [5] << 21
[6] = >> 21
+= [6]
-= [6] << 21
[7] = >> 21
+= [7]
-= [7] << 21
[8] = >> 21
+= [8]
-= [8] << 21
[9] = >> 21
+= [9]
-= [9] << 21
[10] = >> 21
+= [10]
-= [10] << 21
[11] = >> 21
+= [11]
-= [11] << 21
+= * 666643
+= * 470296
+= * 654183
-= * 997805
+= * 136657
-= * 683901
= 0
[0] = >> 21
+= [0]
-= [0] << 21
[1] = >> 21
+= [1]
-= [1] << 21
[2] = >> 21
+= [2]
-= [2] << 21
[3] = >> 21
+= [3]
-= [3] << 21
[4] = >> 21
+= [4]
-= [4] << 21
[5] = >> 21
+= [5]
-= [5] << 21
[6] = >> 21
+= [6]
-= [6] << 21
[7] = >> 21
+= [7]
-= [7] << 21
[8] = >> 21
+= [8]
-= [8] << 21
[9] = >> 21
+= [9]
-= [9] << 21
[10] = >> 21
+= [10]
-= [10] << 21
[0] = byte( >> 0)
[1] = byte( >> 8)
[2] = byte(( >> 16) | ( << 5))
[3] = byte( >> 3)
[4] = byte( >> 11)
[5] = byte(( >> 19) | ( << 2))
[6] = byte( >> 6)
[7] = byte(( >> 14) | ( << 7))
[8] = byte( >> 1)
[9] = byte( >> 9)
[10] = byte(( >> 17) | ( << 4))
[11] = byte( >> 4)
[12] = byte( >> 12)
[13] = byte(( >> 20) | ( << 1))
[14] = byte( >> 7)
[15] = byte(( >> 15) | ( << 6))
[16] = byte( >> 2)
[17] = byte( >> 10)
[18] = byte(( >> 18) | ( << 3))
[19] = byte( >> 5)
[20] = byte( >> 13)
[21] = byte( >> 0)
[22] = byte( >> 8)
[23] = byte(( >> 16) | ( << 5))
[24] = byte( >> 3)
[25] = byte( >> 11)
[26] = byte(( >> 19) | ( << 2))
[27] = byte( >> 6)
[28] = byte(( >> 14) | ( << 7))
[29] = byte( >> 1)
[30] = byte( >> 9)
[31] = byte( >> 17)
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |