В результате получаем то же самое, но гораздо (в n раз) быстрее:
Код:
NSort[{a1, a2, a3}] // InputForm
Piecewise[{
{{a1, a2, a3}, a1 <= a2 <= a3},
{{a1, a3, a2}, a1 <= a3 <= a2},
{{a2, a1, a3}, a2 <= a1 <= a3},
{{a2, a3, a1}, a2 <= a3 <= a1},
{{a3, a1, a2}, a3 <= a1 <= a2},
{{a3, a2, a1}, a3 <= a2 <= a1}
}, Null]
Аналогично для функции
Min:
Код:
NMin[list_List] :=
With[{n = Length[list]},
Piecewise[
Table[
{list[[k]], And @@ (LessEqual[list[[k]], #] & /@ Drop[list, {k}])},
{k, n}
], Null]]
NMin[{a1, a2, a3, a4, a5}] // InputForm
Piecewise[{
{a1, a1 <= a2 && a1 <= a3 && a1 <= a4 && a1 <= a5},
{a2, a2 <= a1 && a2 <= a3 && a2 <= a4 && a2 <= a5},
{a3, a3 <= a1 && a3 <= a2 && a3 <= a4 && a3 <= a5},
{a4, a4 <= a1 && a4 <= a2 && a4 <= a3 && a4 <= a5},
{a5, a5 <= a1 && a5 <= a2 && a5 <= a3 && a5 <= a4}
}, Null]
Быстрее уже вряд ли получится. Хотя глубокого смысла я в этом всё равно не вижу (если только как раз не ставится задача получить такие вот piecewise-выражения в явном виде). Если же речь идёт о том, что на момент вычислений значения всех переменных ещё не известны, то можно ведь просто в нужных местах расставить
SetDelayed,
With,
Block или
Module.