mapToCurveSimpleSwu<F extends PastaFieldElement<F> > static method
(F, F, F)
mapToCurveSimpleSwu<F extends PastaFieldElement<F> >({
- required F u,
- required F theta,
- required F z,
- required F r,
- required PastaCurveParams<
F> isogenyParams,
Implementation
static (F, F, F) mapToCurveSimpleSwu<F extends PastaFieldElement<F>>({
required F u,
required F theta,
required F z,
required F r,
required PastaCurveParams<F> isogenyParams,
}) {
final a = isogenyParams.a;
final b = isogenyParams.b;
final zU2 = z * u.square();
final ta = zU2.square() + zU2;
F conditionalSelect(F a, F b, bool choice) {
return a.conditionalSelect(a, b, choice);
}
FieldSqrtResult<F> sqrtRatio(F a, F b) {
return a.sRatio(a, b);
}
final numX1 = b * (ta + r);
final div = a * conditionalSelect(-ta, z, ta.isZero());
final num2X1 = numX1.square();
final div2 = div.square();
final div3 = div2 * div;
final numGx1 = (num2X1 + a * div2) * numX1 + b * div3;
// x2 = Z * u^2 * x1 (same divisor "div")
final numX2 = zU2 * numX1;
// sqrt_ratio(num_gx1, div3) → (isSquare(gx1), y1)
final sqrtResult = sqrtRatio(numGx1, div3);
final gx1Square = sqrtResult.isSquare; // CtBool
final y1 = sqrtResult.result; // F element (sqrt(h * gx1) or sqrt(gx1))
// y2 = theta * z_u2 * u * y1
final y2 = theta * zU2 * u * y1;
// x = conditional_select(x2, x1, gx1_square)
final numX = conditionalSelect(
numX2, // x2
numX1, // x1
gx1Square,
);
F y = conditionalSelect(
y2, // y2 when gx1 is nonsquare
y1, // y1 when gx1 is square
gx1Square,
);
y = conditionalSelect(-y, y, u.isOdd() == y.isOdd());
return (numX * div, y * div3, div);
}