type uint128 … // mul64 returns a * b. func mul64(a, b uint64) uint128 { … } // addMul64 returns v + a * b. func addMul64(v uint128, a, b uint64) uint128 { … } // shiftRightBy51 returns a >> 51. a is assumed to be at most 115 bits. func shiftRightBy51(a uint128) uint64 { … } func feMulGeneric(v, a, b *Element) { … } func feSquareGeneric(v, a *Element) { … } // carryPropagateGeneric brings the limbs below 52 bits by applying the reduction // identity (a * 2²⁵⁵ + b = a * 19 + b) to the l4 carry. func (v *Element) carryPropagateGeneric() *Element { … }