bool GroupElemJac::IsValid() const { if (IsInfinity()) return false; // y^2 = x^3 + 7 // (Y/Z^3)^2 = (X/Z^2)^3 + 7 // Y^2 / Z^6 = X^3 / Z^6 + 7 // Y^2 = X^3 + 7*Z^6 FieldElem y2; y2.SetSquare(y); FieldElem x3; x3.SetSquare(x); x3.SetMult(x3,x); FieldElem z2; z2.SetSquare(z); FieldElem z6; z6.SetSquare(z2); z6.SetMult(z6,z2); z6 *= 7; x3 += z6; y2.Normalize(); x3.Normalize(); return y2 == x3; }
static bool IsInfinity(FloatConstant* value) { return IsInfinity(value->Value(), value->GetType()->GetSubtype()); }
static void OutputConstantUnion(TInfoSink& out, const TIntermTyped* node, const TConstUnionArray& constUnion, int depth) { int size = node->getType().computeNumComponents(); for (int i = 0; i < size; i++) { OutputTreeText(out, node, depth); switch (constUnion[i].getType()) { case EbtBool: if (constUnion[i].getBConst()) out.debug << "true"; else out.debug << "false"; out.debug << " (" << "const bool" << ")"; out.debug << "\n"; break; case EbtFloat: case EbtDouble: #ifdef AMD_EXTENSIONS case EbtFloat16: #endif { const double value = constUnion[i].getDConst(); // Print infinities and NaNs in a portable way. if (IsInfinity(value)) { if (value < 0) out.debug << "-1.#INF\n"; else out.debug << "+1.#INF\n"; } else if (IsNan(value)) out.debug << "1.#IND\n"; else { const int maxSize = 300; char buf[maxSize]; snprintf(buf, maxSize, "%f", value); out.debug << buf << "\n"; } } break; case EbtInt: { const int maxSize = 300; char buf[maxSize]; snprintf(buf, maxSize, "%d (%s)", constUnion[i].getIConst(), "const int"); out.debug << buf << "\n"; } break; case EbtUint: { const int maxSize = 300; char buf[maxSize]; snprintf(buf, maxSize, "%u (%s)", constUnion[i].getUConst(), "const uint"); out.debug << buf << "\n"; } break; case EbtInt64: { const int maxSize = 300; char buf[maxSize]; snprintf(buf, maxSize, "%lld (%s)", constUnion[i].getI64Const(), "const int64_t"); out.debug << buf << "\n"; } break; case EbtUint64: { const int maxSize = 300; char buf[maxSize]; snprintf(buf, maxSize, "%llu (%s)", constUnion[i].getU64Const(), "const uint64_t"); out.debug << buf << "\n"; } break; default: out.info.message(EPrefixInternalError, "Unknown constant", node->getLoc()); break; } } }