Rotation matrix
- .
Hard and soft
References
Así como Viktor Emil Frankl desarrollo la logoterapia para superar los rigores de los campos de concentración Nazi, Jakow Trachtenberg ocupo su mente en desarrollar un sistema de aritmética mental al verse en la misma situación.
El sistema Trachtenberg de rápido cálculo mental, similar a las matemáticas Védicas, consiste en un conjunto de patrones para realizar operaciones aritméticas. Los algoritmos más importantes son multiplicación,división, y adición. El método también incluye algoritmos especializados para realizar multiplicaciones por números entre 5 y 13.
Abusando de la notación
(11)a = 11Σai10i =
an10n+1 + [Σj=0n-1(aj+aj+1)10j ]+ a0
(12)a = 12Σai10i =
an10n+1 + [Σj=0n-1 (aj+2aj+1)10j ]+ 2a0
Definiendo
bj = aj/2, donde / denota división entera
cj = aj mod 2
tenemos
aj = 2bj + cj
(6)a = (10/2)Σai10i + Σai10i =
Σbi10i+1 + Σ(ai + 5ci)10i
bn10n+1 + [Σj=1n(aj + 5cj + bj-1)10j ]+ (a0 + 5c0)
Expresando el algoritmo en python:
def x6(number):
previous = 0
result = 0
power_of_10 = 1
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result =
(digit + odd_term + previous ) *
power_of_10 + result
previous = digit//2
power_of_10 *= 10
number = number // 10
result = previous * power_of_10 + result
return result
De manera similar al caso anterior:
aj = 2bj + cj
(7)a = (10/2)Σai10i + Σ2ai10i =
Σbi10i+1 + Σ(2ai + 5ci)10i
bn10n+1 + [Σj=1n(2aj + 5cj + bj-1)10j ]+ (a0 + 5c0)
Expresando el algoritmo en python:
def x7(number):
previous = 0
result = 0
power_of_10 = 1
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result =
(2*digit + odd_term + previous ) *
power_of_10 + result
previous = digit//2
power_of_10 *= 10
number = number // 10
result = previous * power_of_10 + result
return result
De manera similar al caso anterior:
aj = 2bj + cj
(5)a = (10/2)Σai10i =
Σbi10i+1 + Σ(5ci)10i
bn 10n+1 + [Σj=1n(5cj + bj-1)10j ]+ (5c0)
Expresando el algoritmo en python:
def x5(number):
previous = 0
result = 0
power_of_10 = 1
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result =
(odd_term + previous ) *
power_of_10 + result
previous = digit//2
power_of_10 *= 10
number = number // 10
result = previous * power_of_10 + result
return result
Definiendo
b = 10n+1 – Σj=0naj , o sea el complemento a 10 de a
tenemos
(9)a = 10a –a =
10a –a + b – b =
10a + b – 10n+1 =
(an – 1)10n+1 + [Σj=1n(bj + aj-1)10j ]+ (b0 )
Expresando el algoritmo en python:
def x9(number):
previous = number%10
result = 10 - previous
power_of_10 = 10
number = number // 10
while (number):
digit = number%10
result =
(9 - digit + previous ) *
power_of_10 + result
previous = digit
power_of_10 *= 10
number = number // 10
result =
(previous-1) * power_of_10 +
result
return result
Definiendo
b = 10n+1 – Σj=0naj , o sea el complemento a 10 de a
tenemos
(8)a = 10a –2a =
10a –2a +2 b – 2b =
10a + 2b – (2)10n+1 =
(an – 2)10n+1 + [Σj=1n(2bj + aj-1)10j ]+ (2b0 )
Expresando el algoritmo en python:
def x8(number):
previous = number%10
result = 2*(10 - previous)
power_of_10 = 10
number = number // 10
while (number):
digit = number%10
result =
(2*(9 - digit) + previous ) *
power_of_10 + result
previous = digit
power_of_10 *= 10
number = number // 10
result =
(previous-2) *
power_of_10 + result
return result
Los algoritmos para multiplicar por 3 y por 4 combinan las ideas usadas en la multiplicación por 5 y por 9.
Definiendo
b = 10n+1 – Σj=0naj , o sea el complemento a 10 de a
ai = 2ci + di, donde
ci = ai/2
di = ai mod 2
tenemos
(4)a = 5a –a =
10c + 5d + b – 10n+1
(3)a = 5a –2a =
10c + + 5d + 2b – (2)10n+1
Expresando los algoritmos en python:
def x3(number):
digit = number%10
result = 2*(10 - digit)
if digit % 2:
result += 5
previous = digit // 2
power_of_10 = 10
number = number // 10
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result +=(2*(9 - digit) + odd_term + previous ) * power_of_10
previous = digit//2
power_of_10 *= 10
number = number // 10
result = (previous-2) * power_of_10 + result
return result
def x4(number):
digit = number%10
result = (10 - digit)
if digit % 2:
result += 5
previous = digit // 2
power_of_10 = 10
number = number // 10
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result +=((9 - digit) + odd_term + previous ) * power_of_10
previous = digit//2
power_of_10 *= 10
number = number // 10
result = (previous-1) * power_of_10 + result
return result
Es posible mediante el ejercicio de la memoria acelerar cálculos aritméticos. Este es un patrón general que también se aplica a la implementación algorítmica.
Por ejemplo, al multiplicar números de dos dígitos tenemos
a1a0 x b1b0 = (10a1+a0)(10b1+bo)=
100a1b1+10(a1bo+a0b1)+a0bo
Al multiplicar números de tres dígitos tenemos
a2a1a0 x b2b1b0 = (100a2+10a1+a0)(100b2+10b1+bo)=
10000a2b2 + 1000(a2b1+a1b2) +
100(a2b0+a1b1+a0b2) + 10(a1bo+a0b1)+a0bo
Si recordamos las fórmulas podemos encontrar los dígitos del producto directamente.
Al calcular el cuadrado de un número de 2 dígitos
(a1a0 )2 = (10a1+a0)2=
100a12+10(2a1a0)+a02
Al calcular el cuadrado de un número que termina en 1
(a11 )2 = (10a1+1)2=
100a12+10(2a1)+1
Al calcular el cuadrado de un número que termina en 5
(a15 )2 = (10a1+5)2=
100(a12+a1) + 25=
100a1(a1+1) + 25
Al calcular el cuadrado de un número que empiezan en 5
(5a0 )2 = (50 + a0)2=
100(25 +a0) + a02
Al calcular el productos de números de tres dígitos que empiezan con 1
(1a1 a0)(1b1b0) =
(100 + 10a1 + a0)(100 + 10 b1 + b0) =
10000 + 1000(a1 + b1) + 100(a1b1 + a0 + b0) +
10(a1b0 + a0b1) + a0b0
Multiplicar un número menor que 100 por 99
(a)(99) = 100 (a – 1) + (100 – a)