code: func (priv *PrivateKey) Precompute() {
  	if priv.Precomputed.Dp != nil {
  		return
  	}
  
  	priv.Precomputed.Dp = new(big.Int).Sub(priv.Primes[0], bigOne)
  	priv.Precomputed.Dp.Mod(priv.D, priv.Precomputed.Dp)
  
  	priv.Precomputed.Dq = new(big.Int).Sub(priv.Primes[1], bigOne)
  	priv.Precomputed.Dq.Mod(priv.D, priv.Precomputed.Dq)
  
  	priv.Precomputed.Qinv = new(big.Int).ModInverse(priv.Primes[1], priv.Primes[0])
  
  	r := new(big.Int).Mul(priv.Primes[0], priv.Primes[1])
  	priv.Precomputed.CRTValues = make([]CRTValue, len(priv.Primes)-2)
  	for i := 2; i < len(priv.Primes); i++ {
  		prime := priv.Primes[i]
  		values := &priv.Precomputed.CRTValues[i-2]
  
  		values.Exp = new(big.Int).Sub(prime, bigOne)
  		values.Exp.Mod(priv.D, values.Exp)
  
  		values.R = new(big.Int).Set(r)
  		values.Coeff = new(big.Int).ModInverse(r, prime)
  
  		r.Mul(r, prime)
  	}
  }
docs: // Precompute performs some calculations that speed up private key operations
  // in the future.