2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Проверка сложного условия
Сообщение27.02.2018, 13:22 
Заранее прошу прощения, если создал тему не в том разделе.

Пусть нам требуется определить, действительно ли выполняется
$(\det{A}>0)\wedge (\operatorname{Sp} A>0)\wedge ... \wedge (\varphi(A)>0)$

В системах компьютерной алгебры (я использовал Mathematica) самый долгоработающий вариант есть
$\mathbf{If[}(\det{A}>0)\wedge (\operatorname{Sp} A>0)\wedge ... \wedge (\varphi(A)>0),\mathbf{Print[
Естественно гораздо быстрее работает вариант с вложенными If:
Код:
If[det(A)>0,
   If[sp(A)>0,
...
   If[phi(A)>0,Print["Yes"],Print["No"]]
...
  ,Print["No"]
,Print["No"]]

Ведь тогда проверка может закончиться сразу, узнав что что-либо не выполняется.

Употребляют ли профессионалы такой способ? Как-то со стороны выглядит довольно глупо. Может в системах компьютерной алгебры есть какое-либо автоматическое разделение условий?

Главный вопрос был в том, в каком порядке расставлять условия в If-ах? Правильно я понимаю что для достижения лучшего эффекта надо первым делом проверять наименее вероятное условие, чтобы была больше вероятность отсечь его и сразу закончить проверку с результатом "Нет".
Как тогда лучше проверять что наименее вероятно? Запускать цикл и проверять сколько раз, например, на рандомной матрице будет выполняться $\det{A}>0$ итп?
Спасибо!

 
 
 
 Re: Проверка сложного условия
Сообщение27.02.2018, 17:26 
В языках программирования есть специально для этого вариации логических операторов. Скажем, в Цэ $a\&b$ вычисляет $a,b$ и, наконец, их конъюнкцию; $a\& \&b$ — вычисляет $a$ и в случае ложности $b$ не вычисляется. Есть ли подобное в системах компьютерной алгебры вообще и в Mathematica в частности — не знаю.
Что касаемо наилучшего порядка, то он представляет собой непростую функцию вероятности выполнения/невыполнения условия и сложности проверки оного условия.

 
 
 
 Re: Проверка сложного условия
Сообщение28.02.2018, 07:15 
iifat
В документации Mathematica указано, что логический бинарный оператор $&& (And) $ работает именно так, как от него ожидается :
Цитата:
e1&&e2&&…
is the logical AND function. It evaluates its arguments in order, giving False immediately if any of them are False, and True if they are all True.

То есть если есть выражение (псевдокод) :
Код:
x = 0;
if (x > 2 && x < 10)...

, то дальше условия $x>2$ проверка идти не будет, сразу нам вернется $False$.
То есть как минимум, в любом if, содержащем And стоит на первое место ставить условие, которое наиболее вероятно будет иметь значение False. (В случае выше нам бы хотелось, чтобы e1 с наибольшей вероятностью было равно False, так как тогда проверка условий дальше не пойдет.)

 
 
 
 Re: Проверка сложного условия
Сообщение28.02.2018, 10:49 
Аватара пользователя
Sdy в сообщении #1294845 писал(а):
То есть как минимум, в любом if, содержащем And стоит на первое место ставить условие, которое наиболее вероятно будет иметь значение False.
Особенно если вычислительная сложность проверки этого условия не намного выше остальных.

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group