Уменьшите количество операций на простом выражении

Предположим, что я беру вычисление, которое включает только добавление и умножение:

(a+b)*(c+d)

который может быть выполнен многими другими способами, например.

a*(c+d) + b*(c+d)
a*c + a*d + b*c + b*d

В терминах добавлений и умножений число операций, необходимых для каждого из трех приведенных примеров, равно (2,1) (3,2) (3,4) соответственно. Ясно, что если цель состоит в том, чтобы сократить общее количество операций, то первое преимущество. Есть ли способ, с помощью произвольного выражения найти порядок вычислений, который требует наименьшего числа операций?

Примечание: Этот вопрос повторно запрашивается у SE.math для понимания и перспективы толпы CS.

Ответы

Ответ 1

Вы хотите эффективно генерировать все возможные эквивалентные алгебраические выражения и выбирать ту, которая занимает наименее дорогостоящее количество шагов (добавление X три раза дешевле на большинстве машин, чем умножение X на 3).

Неправильно это делать, так как число "эквивалентных" формул бесконечно.

Однако Пелегри-Ллоплат разработал схему генерации оптимального кода с учетом фиксированного числа правил алгебраической перезаписи, называемого "BURS" (восходящая система восходящего восхождения ). Это было реализовано в некоторых генераторах кода.

В сущности, он строит автономные большие автоматы, чьи состояния отслеживают набор возможных примененных переписаний. Каждое государство знает, что генерировать, когда это происходит, поэтому онлайн-время для генерации кода дешево.

Ответ 2

Игнорируя полномочия переменных и целочисленные коэффициенты, это сводится к проблеме , правильно?

Ответ 3

Для эффективной оценки многочленов в одночленной форме существует правило Horner. В соответствии с этим, учитывая многочлен степени n

p (x) = a n x n + a n-1 x n-1 +... + a 1 x 1 + a 0

Требуется только n умножений (не n + (n-1) + (n-2) +... + 1 = n (n + 1)/2, как это может показаться с первого взгляда). Это потому, что полином можно переписать как

p (x) = ((a n x + a n-1) x + a n-2) x +... a 1) x + a 0

Ответ 4

Одна идея - рассмотрим переменные как логические значения и запишем форму maxterm текст ссылки

Ответ 5

Не уверен в общем случае, но похоже, что многочлены факторинга улучшают производительность. Пример из удаленного курса comp sci:

a * x^2 + b * x + c

улучшается путем разложения x:

x * (a * x + b) + c