Как я могу сделать эту операцию без паренов? - PullRequest
0 голосов
/ 23 октября 2018

Здесь Я читал, что «Вавилоняне придумали« умножение на квадратные квадраты », которое сводит умножение к вычитанию:

a*b = (a+b)^2/4 - (a-b)^2/4

Когда я попробовал это в APL, я закончилс этим:

(((a + b) * 2) ÷ 4) - (((a - b) * 2) ÷ 4)

Но разве это не уродливо со всеми этими символами? Я не могу понять, как поставить "÷ 4" перед "(a + b) * 2)", чтобы он выполнялся последнимсогласно правилу «справа налево».

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

(Отказ от ответственности: я никогда раньше не видел APL, так что, возможно, это не идиоматично. Но это просто язык программирования; насколько это может быть сложно?)

Я придумал следующее,который вообще не использует скобок:

-/2*⍨0.5×a+b×1 ¯1

Алгоритм:

  • Создать массив, содержащий [1, -1].
  • Умножить каждый элемент на b, давая[b, -b].
  • Добавьте a к каждому элементу, давая [a+b, a-b].
  • Умножьте каждый элемент на 1/2 (0,5), получив [(a+b)/2, (a-b)/2].
  • Квадрат каждого элемента (используя оператор коммутирования , чтобы поставить показатель слева), давая [((a+b)/2)^2, ((a-b)/2)^2], что эквивалентно [(a+b)^2 / 4, (a-b)^2 / 4].
  • Вычесть элементы друг от друга, давая (a+b)^2 / 4 - (a-b)^2 / 4.
0 голосов
/ 23 октября 2018

Возможно, вы захотите заглянуть в оператор commute.Он принимает одну функцию и выводит новую функцию, идентичную старой, но с замененными аргументами:

      5-2
3
      5-⍨2
¯3

Таким образом, ваша формула может быть записана как:

(4 ÷⍨ 2 *⍨ a + b) - (4 ÷⍨ 2*⍨ a - b)

Полная документация здесь.

...