sqrtRatio method

FieldSqrtResult<F> sqrtRatio(
  1. F num,
  2. F div
)

Implementation

FieldSqrtResult<F> sqrtRatio(F num, F div) {
  // Helper for repeated squaring
  F sqr(F x, int i) {
    var res = x;
    for (var j = 0; j < i; j++) {
      res = res.square();
    }
    return res;
  }

  // s = div^(2^S - 1) using an addition chain
  F s = div;
  for (var i = 0; i < 5; i++) {
    s = sqr(s, 1 << i) * s;
  }

  // t = div^(2^(S+1) - 1)
  final t = s.square() * div;

  // w = (num * t)^((T-1)/2) * s
  final w = (t * num).powByTMinus1Over2() * s;

  // v = u^((T-1)/2)
  final v = w * div;

  // uv = u * v
  final uv = w * num;

  // Compute sqrt_common
  final res = sqrtCommon(uv, v);

  // Check square vs nonsquare
  final sqdiv = res.square() * div;
  final isSquare = (sqdiv - num).isZero();
  final isNonSquare = (sqdiv - rootOfUnity * num).isZero();

  assert(num.isZero() || div.isZero() || (isSquare ^ isNonSquare));

  return FieldSqrtResult(res, isSquare);
}