Задача

8/8

Умножение на натуральное. Франгмент подпрограммы

Задача

Операция умножения это замена многократного сложения.
Пусть определена операция сложения на объектами типа A. 
Необходимо выполнить операцию\(A\cdot n =\) \(\underbrace {A+...+A}_{n\ раз}\) , то есть организовать умножение объекта типа A на натуральное число n
Ваша программа должна быть достаточно эффективной и выполнять не более, чем \(2\cdot log_2(n) \) операций сложений.
Даны объект A /представлен как строка/  и натуральное число n.  Напишите фрагмент кода, эффективно выполняющий операцию \(A\cdot n\) 
В шаблоне представлен фрагмент кода, выполняющий операцию \(A\cdot n\) за n  операций сложения
def multi( A, n ): # умножение объекта A на натуральное число n
   rez=None 
   for i in range(n):
      rez=my_add(rez,A) # my_add(x,y)  - выполняет сложение объектов x+y (если один есть None, то возвращает значение другого) 
  return rez         

Примечание:
Операция * для объектов либо неопределена, либо вернет неверный результат. Поэтому запрещено использовать операцию * (умножение).
Подпрограмма my_add( x, y ) возвращает результат "сложения" объектов x  и  y (если они определены) или один из объектов (если другой неопределен, то есть my_add(None, y)  возвращает y )