public override long LongIndexOf(BigInteger item) { if (item.Sign <= 0) { return(-1L); } if (item == BigInteger.One) { return(0L); } if (_num.Sign <= 0) { return(-1L); } if (!(_num % item).IsZero) { return(-1L); } long index = 0L, mult = 1L; using (var x = _factors.GetEnumerator()) { using (var y = _prime.Factors(item).ToLookup(z => z).GetEnumerator()) { y.MoveNext(); while (x.MoveNext()) { if (x.Current.Key == y.Current.Key) { index += y.Current.Count() * mult; if (!y.MoveNext()) { break; } } mult *= x.Current.Count() + 1L; } } } return(index); }
public BigDivisor(BigInteger num, BigPrime prime) { _factors = prime.Factors(num).ToLookup(x => x); _num = num; _prime = prime; }