У меня есть набор полиномиальных выражений, созданных системой компьютерной алгебры (CAS). Например, это один из элементов этого набора.
-d*d*l*l*q-b*b*l*l*q+2*d*f*j*l*q+2*b*f*h*l*q-f*f*j*j*q-b*b*j*j*q+2*b*d*h*j*q-f*f*h*h*q-d*d*h*h*q+b*b*j*j*o*o-2*b*d*h*j*o*o+d*d*h*h*o*o-2*b*b*j*l*n*o+2*b*d*h*l*n*o+2*b*f*h*j*n*o-2*d*f*h*h*n*o+2*b*d*j*l*m*o-2*d*d*h*l*m*o-2*b*f*j*j*m*o+2*d*f*h*j*m*o+b*b*l*l*n*n-2*b*f*h*l*n*n+f*f*h*h*n*n-2*b*d*l*l*m*n+2*b*f*j*l*m*n+2*d*f*h*l*m*n-2*f*f*h*j*m*n+d*d*l*l*m*m-2*d*f*j*l*m*m+f*f*j*j*m*m
Мне нужно как можно быстрее выполнить их все в программе на языке C. Если вы внимательно посмотрите на любую из этих формул, очевидно, что мы можем оптимизировать их для скорости вычислений. Например, в вставленном выше полиноме я сразу вижу термины -d * d * l * l * q, 2 * d * f * j * l * q и -f * f * j * j * q, чтобы я мог заменить их сумму на -q * square (d * lf * j). Я считаю, что здесь можно много чего сделать. Я не верю (но, возможно, ошибаюсь), что какой-либо компилятор сможет найти эту оптимизацию, а может быть, более продвинутую. Я пытался попросить Maxima (CAS) сделать это за меня, но ничего не вышло (так как я новичок с максимумами, я, возможно, пропустил волшебную команду). Итак, мой первый вопрос: какой инструмент / алгоритм мы можем использовать для оптимизации полиномиального выражения для скорости вычислений?
Когда дело доходит до оптимизации набора полиномиальных выражений, разделяющих большинство своих переменных, все становится сложнее. В самом деле, оптимизация выражения по выражению может быть неоптимальной, потому что общие части могут быть идентифицированы компилятором до оптимизации, но не больше после, если это не выполняется в целом. Итак, мой второй вопрос: какой инструмент / алгоритмы мы можем использовать для оптимизации набора полиномиальных выражений для скорости вычислений?
С наилучшими пожеланиями,
P.S. : этот пост имеет некоторые сходства с "компьютерная алгебра софт, чтобы минимизировать количество операций в наборе многочленов", однако ответы, данные в этом одном, указывают на программы CAS, а не на то, как мы можем использовать их для достижения нашей цели.
sum(constant*a^x*b^y*c^z...)
? - person biziclop   schedule 30.01.2015dags
иcommon subexpressions
. - person 500 - Internal Server Error   schedule 30.01.2015