Пример #1
0
 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);
 }
Пример #2
0
        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);
        }
Пример #3
0
 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;
 }
Пример #4
0
 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;
 }