docs: public synchronized void precompute(final boolean precomputeSingle) {
      org.mariadb.jdbc.internal.com.send.authentication.ed25519.math.GroupElement Bi;
  
      if (precomputeSingle && this.precmp == null) {
        // Precomputation for single scalar multiplication.
        this.precmp = new org.mariadb.jdbc.internal.com.send.authentication.ed25519.math.GroupElement[32][8];
        // TODO-CR BR: check that this == base point when the method is called.
        Bi = this;
        for (int i = 0; i < 32; i++) {
          org.mariadb.jdbc.internal.com.send.authentication.ed25519.math.GroupElement Bij = Bi;
          for (int j = 0; j < 8; j++) {
            final FieldElement recip = Bij.Z.invert();
            final FieldElement x = Bij.X.multiply(recip);
            final FieldElement y = Bij.Y.multiply(recip);
            this.precmp[i][j] = precomp(this.curve, y.add(x), y.subtract(x),
                x.multiply(y).multiply(this.curve.get2D()));
            Bij = Bij.add(Bi.toCached()).toP3();
          }
          // Only every second summand is precomputed (16^2 = 256)
          for (int k = 0; k < 8; k++) {
            Bi = Bi.add(Bi.toCached()).toP3();
          }
        }
      }
  
      // Precomputation for double scalar multiplication.
      // P,3P,5P,7P,9P,11P,13P,15P
      if (this.dblPrecmp != null) {
        return;
      }
      this.dblPrecmp = new org.mariadb.jdbc.internal.com.send.authentication.ed25519.math.GroupElement[8];
      Bi = this;
      for (int i = 0; i < 8; i++) {
        final FieldElement recip = Bi.Z.invert();
        final FieldElement x = Bi.X.multiply(recip);
        final FieldElement y = Bi.Y.multiply(recip);
        this.dblPrecmp[i] = precomp(this.curve, y.add(x), y.subtract(x),
            x.multiply(y).multiply(this.curve.get2D()));
        // Bi = edwards(B,edwards(B,Bi))
        Bi = this.add(this.add(Bi.toCached()).toP3().toCached()).toP3();
      }
    }