Ao fazer cálculo mental, pode-se fazer:
- Dado um número inteiro k, some todos os dígitos (na base 10) e, se o resultado for múltiplo de 3, k será múltiplo de 3.
Você conhece algum algoritmo funcionando de maneira semelhante, mas operando com dígitos de números binários (bits)?
No começo, eu estava pensando em usar as funções prontas da minha linguagem convertendo número inteiro para ascii para realizar a conversão da base 2 para a base 10 e depois aplicar o truque de cálculo mental. Mas é claro que eu também poderia codificar a conversão de base 2 para 10. Ainda não o fiz, mas vou tentar.
Então eu pensei na divisão euclidiana na base 2 ...
No entanto, gostaria de saber se existem outros meios, algoritmos.
algorithms
Stephane Rolland
fonte
fonte
Respostas:
Considere as duas observações a seguir (deixadas como um exercício para o leitor):
Concluímos que um número (em binário) é divisível por três se e somente se a soma dos bits nas posições pares for igual à soma dos bits nas posições ímpares módulo 3.
fonte
Que tal um autômato de estado finito para o trabalho?
É claro que a mágica é apenas o módulo de computação 3. A adição do símbolo a string por trás x significa que o "valor binário" da string vai de v a l ( x ) para x a 2 ⋅ v a l ( x ) + a para x a . Consequentemente, do estado pe símbolo a passamos para o estado 2 p + a mod 3 , para p ∈ { 0 , 1 , 2a x val(x) x 2⋅val(x)+a xa p a 2p+amod3 e um ∈ { 0 , 1 } . Nota x ∈ { 0 , 1 } ∗ é uma string, sendo que v a l ( x ) ∈ N é seu valor como string binária.p∈{0,1,2} a∈{0,1} x∈{0,1}∗ val(x)∈N
fonte
Em binário, os números 1, 100, 10000 (= 100 × 100), 1000000 (= 100 × 100 × 100) etc. todos fornecem o mesmo restante após a divisão por 11 (três). Portanto, se dividirmos um número binário em partes de comprimento par , a soma das partes fornecerá o mesmo restante que o número original.
(Ao dividir o número, adicionamos quantos zeros forem necessários ao início . Por exemplo, dividiríamos 10111 nos grupos 01,01,11 ou 0001,0111.)
Matematicamente, apenas divida o número em grupos de dois dígitos e adicione os grupos; e repita isso até que o resultado se torne 00 ou 11 = o número original era um múltiplo de três; ou 01 ou 10 = o número original não era um múltiplo de três.
Para um programa de computador, o uso de grupos de oito, dezesseis ou trinta e dois bits pode ser mais rápido para sua CPU. Por exemplo, se a adição de oito bits for mais rápida, faça uma soma de todos os bytes e, novamente, até que o resultado caiba em um byte. Em seguida, use uma instrução para determinar o restante depois de dividir por três.
(Observação: estamos assumindo números inteiros não assinados aqui. Com um número assinado, ele precisa de um pouco mais de atenção. Por exemplo, 129 é um múltiplo de 3, mas -127 não, embora os bits 10000001 signifiquem ex como um byte não assinado e este último como um byte assinado.)
fonte
Embora não seja específico do binário, na dúvida, a subtração repetida é sempre uma maneira infalível de calcular a divisão com o restante (e, portanto, se um número for múltiplo de 3).
fonte