A Conjectura de Collatz

A Conjectura de Collatz é o problema não resolvido de matemática mais simples da história.

Pegue um número qualquer n.

  • Se n for par, divida por 2
  • Se n for ímpar, calcule 3*n+1

E continue fazendo essa conta.

A conjectura diz que a sequência sempre vai convergir para 1.

Exemplo: número inicial 5

5 -> 16 -> 8 -> 4 -> 2 -> 1

Foram 5 passos para convergir para 1.

Exemplo: número inicial 6

6 -> 3 -> 10 -> 5 -> 16 ->  8 -> 4 -> 2 -> 1

Foram 8 passos para convergir para 1.

Para números de 2 a 50, o resultado do número de passos mostra:

Informações interessantes: apesar de extremamente simples de ser formulada, essa conjectura até hoje não foi provada.

É contra intuitivo; parece que vai crescer, mas aí converge.

A sequência é errática: um número pode precisar de 100 passos, o vizinho precisa de 5.

No VBA, a forma mais simples de resolver é com um simples loop while.

Function collatz(n)

Dim count As Long

count = 0
While n > 1

If n Mod 2 = 0 Then
    n = n / 2
Else
    n = 3 * n + 1
End If
count = count + 1

Wend

collatz = count

End Function

É possível pensar numa estrutura da dados mais complexa, porém com melhor performance computacional.

Por exemplo, salvar o número de passos de todos os valores já rodados. Rodar a sequência até chegar a um número menor do que o atual, e aí resgatar da memória o resultado já calculado.

Com esse método, é possível calcular os primeiros 110 mil números, em menos de 1 segundo.

No VBA, o limite é restrição de tamanho do tipo Long. Não há um tipo Big Int, como em Java ou Python, o que torna bem complicado calcular mais do que isso.

Código no Github: https://github.com/asgunzi/CollatzVBA

Veja também:

https://en.wikipedia.org/wiki/Collatz_conjecture

https://www.quantamagazine.org/why-mathematicians-still-cant-solve-the-collatz-conjecture-20200922/

Como criar uma foto pixelada no Excel

A ideia deste tutorial é pegar uma imagem qualquer e pintar as células do Excel de forma correspondente.

Uma imagem é apenas um retângulo dividido em quadriculados (o pixel), e cada pixel é pintado de uma cor.

Imagine que cada célula é pintada de uma combinação de Vermelho, Verde e Azul, as cores primárias.

Cada célula terá um tom de Red, Green e Blue, e essa tonalidade varia de 0 a 255.

Infelizmente, o VBA não tem uma boa biblioteca de manipulação de imagens. Recomendo instalar o OpenCV (open computer vision), no Python.

https://pypi.org/project/opencv-python/

A rotina tem dois passos:

1 – ler a imagem e salvar a matriz de dados (Python)

2 – ler a matriz de dados e colorir o Excel

Passo 1) Rodar o arquivo “OpenCVReadFile.py”, no Python.

Indicar a localização do arquivo de imagem a desenhar

Mudar o local do arquivo CSV de destino.

Essa rotina lê a imagem e salva a matriz de dados em CSV.

Passo 2)  Rodar a macro “Pixeliza” do Excel em anexo. É necessário mudar o endereço do arquivo CSV.

E pronto, temos uma reprodução da imagem na planilha, que pode ser editada normalmente, como qualquer arquivo Excel.

Atenção. Rodando essa macro, descobri que o Excel tem um limite de 4000 células com formatação diferente.

E, pior, chega facilmente nesse limite.

Portanto, o esquema citado só funciona com imagens de resolução muito baixa.

Vide arquivos no Github: https://github.com/asgunzi/FotoPixeladaExcel

Tem o Excel com a macro e o código Python.

Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Escrever por extenso

A macro da planilha (https://github.com/asgunzi/EscreverExtensoVBA) lê um número e escreve por extenso.

O código não é meu. Originalmente é VB6. Peguei num fórum e colei no Excel, e parece que funciona legal.

Não sei se isso pode ser útil de alguma forma.

Ideias técnicas com uma pitada de filosofia
https://ideiasesquecidas.com/

Entre no grupo de estudos de Computação Quântica:
https://www.facebook.com/groups/1013309389112487

Pequena rotina de criptografia

A criptografia existe desde a Roma antiga, pelo menos.

A forma mais básica de codificar / decodificar uma mensagem é com uma cifra de substituição simples.

Por exemplo, transformo a em w, b -> x, c -> y,

Segundo a tabela abaixo.

Exemplo:

“contar” -> “ykjpwn”

E para decodificar, fazer o oposto:

“ykjpwn” -> “contar”

Desafio: criar uma rotina que codifique/decodifique uma frase qualquer.

A minha resposta está no arquivo aqui.

Basta ativar macros e rodar. A macro faz exatamente o que a gente faria manualmente: para cada sílaba, procura na tabela qual o símbolo correspondente, e substitui.

Uma curiosidade. Tem um conto de Sherlock Holmes, chamado “o caso dos dançarinos”.

O detetive recebeu uma mensagem cifrada, com figuras de dançarinos. É a mesma lógica do desafio proposto, cifra de substituição simples.

Para quebrar o código, Holmes fez uma contagem dos símbolos. O dançarino que mais aparecia seria provavelmente o “E”, letra mais frequente em inglês. A seguir, o segundo símbolo mais frequente seria o “E”.

E assim sucessivamente, ele foi deduzindo as letras até decodificar a mensagem.

xkw pwnza lwnw pkzko!

Multiplicador de shapes – Power Point

Segue uma rotina que pode ser útil, para criar apresentações (Multiplicador.pptm)

É um “multiplicador de shapes”.

O objetivo é pegar um shape assim:

E criar cópias dele:

O primeiro passo é selecionar com o mouse o shape que queremos multiplicar.

Com o shape selecionado, rodamos a macro.  Atalho (alt + F11) para abrir o editor de macros, e F5 para rodar a macro “multiplier”

Vai surgir uma caixa, perguntando quantas linhas e colunas queremos (separar os números com um espaço)

Resultado:

Se eu tiver várias formas compostas, é necessário agrupar todos num único shape.

Resultado:

As macros devem estar habilitadas.


Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Mudar cor de célula – VBA

Segue um exemplo de código VBA, para mudar a cor de  fundo de uma célula.

Todas as cores podem ser decompostas em vermelho, verde e azul. O código RGB atribui um número de 0 a 255 para cada cor.

O código a seguir diz para colorir o range “f4:g5” com as cores lidas na planilha.

R = Range(“b5”)

G = Range(“c5”)

B = Range(“d5”)

Exemplo no One Drive aqui.

Teleprompter em Excel

O teleprompter é um recurso utilizado na televisão, em que o texto vai aparecendo para o apresentador.

Um projeto simples é fazer um teleprompter utilizando Excel e VBA.

(download no Github, com versão Python: https://github.com/asgunzi/Teleprompter)

É útil nos dias de hoje, em que somos convidados a gravar vídeos de vez em quando.

Coloque o texto a ser lido numa célula:

O código VBA vai:

– quebrar o texto em parágrafos (dica: break line é o chr(10)).

– utilizar um userform para mostrar o texto

– utilizar a função wait para esperar um tempo entre um texto e outro

É necessário ativar macros.

Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Exercício – codificação e decodificação

A codificação é importante para transformar qualquer coisa mensurável (texto, imagens, sons) em números computáveis.

Digamos que a tabela com a codificação utilizada seja a da figura abaixo.

Se temos 26 letras no alfabeto, 5 bits binários são suficientes para descrever todas as letras (2⁵ = 32, que é maior do que 26). Acrescentemos o espaço em branco como o primeiro da lista.

Pelo código acima:

“lua”011001010100001

Pois

“l” = 01100 

“u” = 10101

“a” =00001

Importante: ignorar acentos, letras maiúsculas e pontuação, a bem da simplicidade.

Pela mesma lógica,

“ceu”000110010110101
“dom casmurro”001000111101101000000001100001100110110110101100101001001111

O exercício é decifrar a mensagem codificada abaixo.

Decifre:011110000001001011100011001001011100100110100011110000001110000010000010000000010110001101000010000000100001010000010011101010000100000011010000101111

É possível fazer no braço, ou apenas com Excel, embora seja trabalhoso.

Desenho de padrões com círculos

Quando eu era adolescente, vi uma espécie de régua, que permitia fazer padrões bonitos a partir de elipses.

Era um negócio desse tipo:

Ver a imagem de origem

Dá para fazer algo mais ou menos parecido, com apenas um comando VBA: o de plotar círculos. O formato é o seguinte:

ActiveSheet.Shapes.AddShape(msoShapeOval, x, y, comprim, largura)

Para plotar um círculo, devemos saber a posição dele (x,y), o comprimento e largura. Se é um círculo e não uma elipse, comprimento = largura = raio.

O resto dos comandos serve apenas para apagar desenhos antigos, colorir e posicionar os novos círculos.

Algumas convenções:

  • Número de círculos é o número de círculos a plotar.
  • O raio menor é o raio desses círculos.
  • O raio maior é o raio em torno da qual os círculos são plotados
  • E o ângulo, em graus, é o ângulo entre um círculo e outro.

A ilustração a seguir dá uma ideia desses parâmetros.

Obs. Como o ângulo é divisor de 360 graus, tem hora que os círculos ficam um sobre o outro.

Com apenas esses conceitos, é possível gerar algumas variações interessantes.

Planilha para download no Github. Para rodar, é necessário ativar macros.

Outras sugestões são bem-vindas.

Versão web em SVG:

https://asgunzi.github.io/CirculosSVG/

https://ideiasesquecidas.com/

Triângulo de Pascal em Excel

O triângulo de Pascal, em homenagem ao matemático Blaise Pascal, tem uma regra de formação bastante simples. Download aqui.

Cada linha começa e termina com 1. Os demais valores são a soma dos dois números acima da célula.

Ex. O valor 4 abaixo é a soma de 1 e 3, da linha acima.

Pascal - research

É bem simples criar um triângulo desses em Excel. É basicamente, colocar células de somar na posição correta.

A implementação em anexo utiliza macros, mas é a mesma ideia. Para colorir, é só usar formatação condicional.

Fica como exercício para casa: criar uma implementação do triângulo de Pascal.

Curiosidade: o mesmo triângulo é conhecido desde a antiguidade, sendo redescoberto em várias culturas.

Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/