2015-04-21 3 views
0

В соответствии с ниже вопрос взял из самоподготовки exercise:Умножение двух интервалов

Попутно, Бен также загадочно комментирует, «Проверяя признаки концов интервалов, можно разбить mul_interval в девять случаев, только один из которых требует более двух умножений ». Написать функцию быстрого умножения, используя предложение Бену:

def mul_interval_fast(x, y): 
    """Return the interval that contains the product of any value in x and any 
    value in y, using as few multiplications as possible. 

    >>> str_interval(mul_interval_fast(interval(-1, 2), interval(4, 8))) 
    '-8 to 16' 
    >>> str_interval(mul_interval_fast(interval(-2, -1), interval(4, 8))) 
    '-16 to -4' 
    >>> str_interval(mul_interval_fast(interval(-1, 3), interval(-4, 8))) 
    '-12 to 24' 
    >>> str_interval(mul_interval_fast(interval(-1, 2), interval(-8, 4))) 
    '-16 to 8' 
    """ 
    "*** YOUR CODE HERE ***" 

Я мог бы проанализировать, что ниже картина результатов:

(1, 3)(5, 7) ---> [min(5, 7, 15, 21), max(5, 7, 15, 21)]    ---> (5, 21) 
(-1, -3)(-5, -7) ---> [min(5, 7, 15, 21), max(5, 7, 15, 21)]   ---> (5, 21) 
+++++++++++++++++++++++++++++++ 
(1, 3)(5, -7) ---> [min(5, -7, 15, -21), max(5, -7, 15, -21)]  ---> (-21, 15) 
(-1, 3)(5, -7) ---> [min(-5, 7, 15, -21), max(-5, 7, 15, -21)]  ---> (-21, 15) 
(1, -3)(-5, 7) ---> [min(-5, 7, 15, -21), max(-5, 7, 15, -21)]  ---> (-21, 15) 
(-1, -3)(-5, 7) ---> [min(5, -7, 15, -21), max(5, -7, 15, -21)]  ---> (-21, 15) 
+++++++++++++++++++++++++++++++++++ 
(1, 3)(-5, 7) ---> [min(-5, 7, -15, 21), max(-5, 7, -15, 21)]  ---> (-15, 21) 
(-1, 3)(-5, 7) ---> [min(5, -7, -15, 21), max(5, -7, -15, 21)]  ---> (-15, 21) 
(1, -3)(5, -7) ---> [min(5, -7, -15, 21), max(5, -7, -15, 21)]  ---> (-15, 21) 
(-1, -3)(5, -7) ---> [min(-5, 7, -15, 21), max(-5, 7, -15, 21)]  ---> (-15, 21) 
++++++++++++++++++++++++++++++++ 
(1, 3)(-5, -7) ---> [min(-5, -7, -15, -21), max(-5, -7, -15, -21)] ---> (-21, -5) 
(-1, -3)(5, 7) ---> [min(-5, -7, -15, -21), max(-5, -7, -15, -21)] ---> (-21, -5) 
++++++++++++++++++++++++++++++ 
(-1, 3)(5, 7) ---> [min(-5, -7, 15, 21), max(-5, -7, 15, 21)]  ---> (-7, 21) 
(1, -3)(-5, -7) ---> [min(-5, -7, 15, 21), max(-5, -7, 15, 21)]  ---> (-7, 21) 
+++++++++++++++++++++++++++++++ 
(-1, 3)(-5, -7) ---> [min(5, 7, -15, -21), max(5, 7, -15, -21)]  ---> (-21, 7) 
(1, -3)(5, 7) ---> [min(5, 7, -15, -21), max(5, 7, -15, -21)]  ---> (-21, 7) 

Но выше картина не показывает тех nine cases.

Таким образом, в конкретных, я хотел бы понять этот момент: By testing the signs of the endpoints of the intervals, it is possible to break mul_interval into nine cases,

Пожалуйста, помогите мне в этом интервальной арифметике !!!

+1

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что Stack Overflow не является домашней службой. –

ответ

1

Я не уверен, я полностью понимаю, но есть 3 случая для интервала (a1,b1): a<b<=0, a<0<b и 0<=a<b. Таким образом, для двух интервалов (a1,b1) и (a2,b2) существует 3x3 = 9 случаев. Наиболее проблематичным в плане умножения будет то, что a1<0<b1 и a2<0<b2. Тогда вам нужно знать min и maxa1*a2, b1*b2, a1*b2 и, возможно, даже a2*b1, тогда как другие случаи - это просто масштабирование, для которого вам нужно знать обе конечные точки.

+0

Ваши стрелки идут не так. Кроме того, (-16,8) и (-8,16) являются одним и тем же результатом. Должно быть только 3 типа результатов, но 9 способов добраться туда. Также обратите внимание, что (a1, b1) x (a2, b2), где a1 <0

+0

1) родственники ценности? вопрос гласит: «Проверяя признаки конечных точек интервалов». 2) Теперь я изменил знак стрелки. – overexchange

+0

Что у вас лучше. Теперь удалите некоторые случаи. Например, ничего с (1, -3) невозможно, потому что (1, -3) не является интервалом. –

Смежные вопросы