// Just like Split, but return an error when receiving a kill signal from t. func splitOrQuit(z *big.Int, quit <-chan time.Time) (p, q *big.Int, err error) { q, r := big.NewInt(0), big.NewInt(0) if z.Sign() == 0 { return } max := roughSqrt(z) primes := sieve.BigSieve() for { select { case <-quit: err = ErrTimeout return case p = <-primes: if q.DivMod(z, p, r); r.Sign() == 0 { return } if max.Cmp(p) == -1 { q.SetInt64(1) p.Set(z) return } } } return }