Операция умножения это замена многократного сложения.
Пусть определена операция сложения на объектами типа 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 )  
Запрещенные операторы: *; def; import