private IntDomain Divide(IntDomain d0, IntDomain d1, IntDomain d2) { if (!d1.Contains(0)) { d0 = d0.Delete(0); if (d0.Empty) { return(IntDomain.EmptyDomain); } } if (d2.Contains(0)) { return(d0); } if (d2.Maximum() < 0 || 0 < d2.Minimum()) { var x = new[] { d1.Minimum() / d2.Minimum(), d1.Maximum() / d2.Minimum(), d1.Minimum() / d2.Maximum(), d1.Maximum() / d2.Maximum() }; d0 = d0.CapInterval(Min(x), Max(x)); } else { var x = new[] { d1.Minimum() / d2.Minimum(), d1.Maximum() / d2.Minimum(), d1.Minimum() / d2.Maximum(), d1.Maximum() / d2.Maximum(), d1.Minimum(), d1.Maximum(), -d1.Minimum(), -d1.Maximum() }; d0 = d0.CapInterval(Min(x), Max(x)); } return(d0); }
private IntDomain Multiply(IntDomain d0, IntDomain d1, IntDomain d2) { if (!d1.Contains(0) && !d2.Contains(0)) { d0 = d0.Delete(0); if (d0.Empty) { return(IntDomain.EmptyDomain); } } var x = new[] { ToInt(d1.Minimum() * (long)d2.Minimum()), ToInt(d1.Minimum() * (long)d2.Maximum()), ToInt(d1.Maximum() * (long)d2.Minimum()), ToInt(d1.Maximum() * (long)d2.Maximum()) }; d0 = d0.CapInterval(Min(x), Max(x)); return(d0); }
private static IntDomain Multiply(IntDomain d0, IntDomain d1, IntDomain d2) { if (!d1.Contains(0) && !d2.Contains(0)) { d0 = d0.Delete(0); if (d0.Empty) return IntDomain.emptyDomain; } var x = new[] { ToInt(d1.Minimum() * (long) d2.Minimum()), ToInt(d1.Minimum() * (long) d2.Maximum()), ToInt(d1.Maximum() * (long) d2.Minimum()), ToInt(d1.Maximum() * (long) d2.Maximum()) }; d0 = d0.CapInterval(Min(x), Max(x)); return d0; }
private static IntDomain Divide(IntDomain d0, IntDomain d1, IntDomain d2) { if (!d1.Contains(0)) { d0 = d0.Delete(0); if (d0.Empty) return IntDomain.emptyDomain; } if (d2.Contains(0)) { return d0; } if (d2.Maximum() < 0 || 0 < d2.Minimum()) { var x = new[]{d1.Minimum() / d2.Minimum(), d1.Maximum() / d2.Minimum(), d1.Minimum() / d2.Maximum(), d1.Maximum() / d2.Maximum()}; d0 = d0.CapInterval(Min(x), Max(x)); } else { var x = new[]{d1.Minimum() / d2.Minimum(), d1.Maximum() / d2.Minimum(), d1.Minimum() / d2.Maximum(), d1.Maximum() / d2.Maximum(), d1.Minimum(), d1.Maximum(), - d1.Minimum(), - d1.Maximum()}; d0 = d0.CapInterval(Min(x), Max(x)); } return d0; }