mapToCurveSimpleSwu<F extends PastaFieldElement<F>> static method

(F, F, F) mapToCurveSimpleSwu<F extends PastaFieldElement<F>>({
  1. required F u,
  2. required F theta,
  3. required F z,
  4. required F r,
  5. 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);
}