2014 dxdy logo

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

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


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Проверка сложного условия
Сообщение27.02.2018, 13:22 


13/06/10
144
Заранее прошу прощения, если создал тему не в том разделе.

Пусть нам требуется определить, действительно ли выполняется
$(\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 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Проверка сложного условия
Сообщение28.02.2018, 07:15 


07/08/16
328
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 
Заслуженный участник
Аватара пользователя


09/09/14
6328
Sdy в сообщении #1294845 писал(а):
То есть как минимум, в любом if, содержащем And стоит на первое место ставить условие, которое наиболее вероятно будет иметь значение False.
Особенно если вычислительная сложность проверки этого условия не намного выше остальных.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group