Al hacer cálculo mental, uno puede hacer:
- Dado un entero k, sume todos los dígitos (en base 10), y si el resultado es un múltiplo de 3, entonces k es un múltiplo de 3.
¿Conoces algún algoritmo que funcione de manera similar pero que funcione con dígitos (bits) de números binarios?
Al principio, estaba pensando en usar las funciones preparadas de mi lenguaje para convertir enteros a ascii para realizar la conversión de la base 2 a la base 10, luego aplicar el truco de cálculo mental. Pero, por supuesto, también podría codificar yo mismo la conversión de base 2 a 10. Todavía no lo he hecho, pero lo intentaré.
Entonces he pensado en la división euclidiana en la base 2 ...
Sin embargo, me pregunto si hay otros medios, algoritmos.
algorithms
Stephane Rolland
fuente
fuente
Respuestas:
Considere las siguientes dos observaciones (dejadas como ejercicio para el lector):
Concluimos que un número (en binario) es divisible por tres si y solo si la suma de los bits en las posiciones pares es igual a la suma de los bits en las posiciones impares módulo 3.
fuente
¿Qué pasa con un autómata de estado finito para el trabajo?
Por supuesto, la magia es solo el módulo de cálculo 3. Agregar el símbolo detrás de la cadena x significa que el "valor binario" de la cadena va de v a l ( x ) para x a 2 ⋅ v a l ( x ) + a para x a . En consecuencia, desde el estado p y el símbolo a, pasamos al estado 2 p + a mod 3 , para p ∈ { 0 , 1 , 2un X v a l ( x ) X 2 ⋅ v a l ( x ) + a x a pag un 2 p + a mod 3 y un ∈ { 0 , 1 } . Nota x ∈ { 0 , 1 } ∗ es una cadena, mientras que v a l ( x ) ∈ N es su valor como cadena binaria.p ∈ { 0 , 1 , 2 } a ∈ { 0 , 1 } x ∈ { 0 , 1 }∗ v a l ( x ) ∈ N
fuente
En binario, los números 1, 100, 10000 (= 100 × 100), 1000000 (= 100 × 100 × 100) etc. todos dan el mismo resto después de dividir por 11 (tres). Por lo tanto, si dividimos un número binario en partes de longitud par , la suma de las partes da el mismo resto que el número original.
(Al dividir el número, agregamos tantos ceros como sea necesario al principio . Por ejemplo, dividiríamos 10111 en los grupos 01,01,11 o 0001,0111).
Matemáticamente, simplemente divida el número en grupos de dos dígitos, luego agregue los grupos; y repita esto hasta que su resultado sea 00 u 11 = el número original era un múltiplo de tres; o 01 o 10 = el número original no era un múltiplo de tres.
Para un programa de computadora, el uso de grupos de ocho o seis años o treinta y dos bits puede ser más rápido para su CPU. Por ejemplo, si la adición de ocho bits es más rápida, simplemente haga una suma de todos los bytes, y nuevamente, hasta que el resultado encaje en un byte. Luego, use una instrucción para determinar el resto después de dividir por tres.
(Nota: aquí estamos asumiendo enteros sin signo . Con un número con signo, necesita un poco más de atención. Por ejemplo, 129 es un múltiplo de 3, pero -127 no lo es, aunque los bits 10000001 significan para el primero como un byte sin signo y este último como un byte firmado).
fuente
Si bien no es específico de binario, en caso de duda, la resta repetida es siempre una forma segura de calcular la división con el resto (y, por lo tanto, si un número es múltiplo de 3).
fuente