quinta-feira, 19 de fevereiro de 2026

Um Produto Improvável

Agora tenho, por motivos inesperados, dois provedores de internet em minha casa. Um a 350Mbps e outro a 700Mbps.

E, num dia como qualquer outro, passei a ter 1Gbps de conexão a uma rede mundial de computadores. O futuro chegou quando já não fazia falta.

Após muito refletir e pesquisar, resolvi juntar as duas com um roteador Mikrotik. Foi uma decisão confusa e complicada e, ao fim, posso mais ou menos afirmar que escolhi essa saída porque queria um brinquedinho novo para experimentar.

Uma alternativa seria comprar um roteador que suportasse OpenWRT, mas eu já tenho um roteador novinho que funciona bem.

O Mikrotik não é um aparelho simples, então tive que tomar a medida drástica de ler a documentação.

Finalmente, configurei a caixinha para repassar 2/3 do tráfego por um provedor e 1/3 pelo outro. Não configurei failover porque quero saber quando um falhar; caso contrário, eu poderia passar anos sem perceber que estava usando apenas um e pagando dois.

Isso me pôs a pensar sobre um produto que pudesse ser vendido a usuários leigos.

Algumas dificuldades vieram à mente:

  • A instalação precisa ser trivial (o usuário só precisa conectar os cabos)
  • O aparelho precisa descobrir sozinho a velocidade de cada provedor
  • Ele precisa de failover e também precisa comunicar ao usuário quando uma linha cair

Dado que uma pessoa ter dois provedores já é uma situação anormal (não estou considerando empresas, que geralmente têm sua TI ou a terceirizam), um produto para balancear dois provedores já resolveria boa parte do mercado.

Uma solução seria vender um roteador de prateleira com OpenWRT instalado e configurado para duas WANs.

Entretanto, uma questão adicional persiste: desligar os Wi-Fis dos provedores. Quando contratei o segundo provedor, eu resolvi levantar a questão com o vendedor. Eu suspeitei que não seria compreendido, mas ofereci ao vendedor a oportunidade de me surpreender. Como esperado, ele não entendeu o que eu estava propondo; não há equipamento alternativo e não tem sentido não usar o Wi-Fi. Então, eu levantei a questão com o técnico que executou a instalação e, realmente, o provedor só oferece um tipo de modem, mas eu poderia desabilitar o Wi-Fi. Isso não é trivial para um usuário leigo e teria que fazer parte do pacote.

O histórico de produtos configurados pelos consumidores tem uma longa lista de artefatos apreciados por engenheiros e esquecidos pelos consumidores. Um exemplo magnífico é o telefone soviético com autodiscagem.

Um programador como eu certamente teria grande afeto por um telefone com memória de núcleo magnético programável, mas um consumidor encolher-se-ia em horror frente à confusão de fios e de medo de que um tentáculo subitamente o atacasse com um choque elétrico mortal.

Por enquanto, a única saída que me parece prática seria a de uma empresa que fizesse tudo para o consumidor. Entretanto, a necessidade de fazer propaganda para alcançar o público-alvo e o custo não teriam sentido econômico.

Uma saída interessante para os provedores, mas não para proto-empreendedores que sonham com a dominação mundial como eu, seria as empresas de Internet oferecerem uma solução. Afinal, os provedores A e B poderiam ambos ganhar clientes da concorrência simultaneamente. Vou sugerir isso ao meu provedor local (porque o provedor grande, nacional, sequer consegue contratar um POS que funcione).

Essa odisséia toda me levou também a aprender uma coisa muito importante sobre a redundância. Todos os provedores que chegam ao meu condomínio, exceto um, vêm pela mesma rua e pelos mesmos postes. Quando um poste pegou fogo, apenas o provedor que chega por outra rua continuou a prover o serviço. Logo, uma redudância efetiva passa também por entender a infraestrutura da cidade.

quarta-feira, 28 de janeiro de 2026

Teste de Divisibilidade Usando Conversão de Bases

Há muitos anos eu havia escrito uma pequena função para fazer conversão de bases sem ifs. Mais recentemente, mostrei como o teste de divisibilidade por 3 ou 9 pode ser generalizado para todos os números usando a base+1.

Resolvi juntar as duas coisas e escrever um teste genérico de divisibilidade usando esses dois conceitos e ainda mostrando que a soma dos dígitos pode ser feita com o módulo apenas.

Sobre o módulo, considere o número 324. Para determinar se é múltiplo de 3, podemos trabalhar com módulo 3.


 3 + 2 + 4 = 9
 3%3 + 2%3 + 4%3 => 0 + 2 + 1 = 3
 

Então, isso significa que podemos trabalhar com números menores, o que pode ser útil quando estamos fazendo contas com lápis e papel ou quando o computador está trabalhando em números muito grandes.


use strict;

sub to_base {
  my $n=shift;
  my $base=shift;
  reverse 
    map { int(($n%($base**($_+1)))/($base**$_)) }
      0..int(log($n)/log($base));
}

sub is_divisible {
  my ($n, $d)=@_;
  my $t=0;
  
  map { $t=($t + $_ % $d) % $d } to_base($n, $d+1);
  return $t==0;
}

my $is_divisible=is_divisible(5603, 13);
print "5603 => $is_divisible\n";   

5603 => 1

De fato, 5603 = 13 * 431.

Alterei a antiga função to_base() para retornar um array dos valores dos dígitos. A função original usava o alfabeto para ampliar a variedade de dígitos.

sexta-feira, 2 de janeiro de 2026

Base de Resíduos e Números Afortunados

Já investiguei vários tipos de sistemas numéricos, mas há um que é bastante diferente dos outros, porque não há uma maneira direta para converter para outras bases.

Uma consequência do Teorema Chinês dos Restos é que podemos representar um número como um conjunto de restos. A única exigência é a de que os números da nossa base sejam primos entre si.

Por exemplo, se eu usar 2 e 3 como uma base, posso representar todos os números até 6. O 1 eu represento com a tupla (1,1), o 2 com (0,2), o 3 com (1,0), o quatro com (0,1), o 5 com (1,2).

Seu eu usar apenas números primos até 8 bits (são 53 primos), posso representar números até o seguinte:

64266330917908644872330635228106713310880186591609208114244758680898150367880703152525200743234420230.

Esse monstro de 101 dígitos necessitaria 334 bits para ser representado num computador. Entretanto, com o uso da aritmética modular, posso fazer muitas operações de apenas 1 byte. Repare que 53*8=424 bits, então não é espaço que é economizado, mas sim complexidade das operações.

Claro que produzir o resultado no final exige uma complicação adicional.

Adição e subtração são definidos assim:


(A + B) mod C = (A mod C + B mod C) mod C
(A - B) mod C = (A mod C - B mod C) mod C

Então, podemos ir somando números aos poucos e por partes até chegar a uma soma realmente grande sem nunca ter que operar com um número grande. Infelizmente, em algum momento será preciso converter para uma base mais prática para visualizar o resultado. Um algoritmo relativamente eficiente é o de Algoritmo de Garner, mas eu vou descrever uma forma de reconstruir o resultado que também nos ensina um pouco sobre esse tipo de base.

Dada uma base formada por (3,11,17), que podemos usar para representar números de 0 até 561 (3*11*17), e um número representado pelos restos (2,4,1), vamos procurar começando pelo primeiro número a satisfazer x%17=1, que é 1 (ou 18). Se formos somando 17, em algum momento vamos encontrar um número que, além de ter resto 1 para 17, terá resto 4 para 11. Ou seja, queremos resolver (18+(x*17))%11=4. Este número é 103. A partir de 103, precisamos encontrar um número que também tenha resto 2 para 3. Podemos pular de 187 em 187 (11*17). Ou seja, precisamos resolver (103+(x*187))%3=2. E isso nos leva a 290.

O que isso nos ensina? Os restos se repetem de 3 em 3, de 11 em 11, de 17 em 17, de 3*11 em 3*11, de 3*17 em 3*17, e de 11*17 em 11*17. E também de 3*11*17 em 3*11*17.

Agora vou introduzir os números afortunados. Um número afortunado é o menor inteiro maior que 1 que, somado a um primorial resulta num primo.

Se tivermos uma base de restos baseada em primos, sabemos que todos os casos em que nenhum dos restos for 0 é um candidato a primo. Por exemplo, vamos ver a base (2,3):

nn%2n%3
000
111
202
310
401
512

Os dois restos são diferentes de 0 com n=1 ou com n=5, que é primo. Claro que, numa base com mais elementos, um candidato a primo pode ser apenas um múltiplo de um primo que não está na base. O que é importante ressaltar é que o padrão de restos se repete. Então, quando estamos tratando de números maiores de 2*3, não temos como saber precisamente de qual número se trata: temos que viver dentro do universo de 0 a 5.

nn%2n%3
000
111
202
310
401
512
600
711
802
910
1001
1112

Se ignorarmos o 1, todos os casos em que nenhum dos restos é 0 representam primos.

O primeiro primo depois de 6 é 7, mas esse não conta, porque é necessário somar apenas 1 a 6. O próximo é 11 e o número afortunado, neste caso, é 5, que é primo. Dado que os restos da representação de 11 têm que ser iguais aos restos da representação de 5 (porque a diferença é 6), seria até surpreendente encontrar um caso em que o número afortunado não fosse primo.

Mas isso não é prova suficiente, porque poderia acontecer, numa base muito maior, que o número afortunado fosse múltiplo de um primo que não está no primorial (ou na base de resíduos, se preferir).

quarta-feira, 12 de novembro de 2025

Conto de 3 Estrelas

Zed dorme profundamente quando uma música muito suave começa a soar pelo despertador digital sobre sua mesa de cabeceira. O volume cresce aos poucos e a música ganha intensidade.

Quando finalmente está desperto e ordena que a música seja encerrada, o despertador solicita que a seleção musical seja avaliada. Quatro estrelas.

Ainda claudicante, Zed tateia o balcão do banheiro à procura do remédio. Surge, então, no espelho, uma enquete: qual dessas marcas você conhece? Zed ignora e vai procurar a cafeteira na cozinha.

O aroma dos melhores grãos colombianos deixa a cozinha quase que encantada. A cafeteira indaga: quantas estrelas esse café merece? Quatro, porque não é hora de responder a enquentes idiotas.

Alimentado, Zed volta ao quarto para vestir um terno, qualquer terno. O espelho mostra comerciais relacionados a seus sapatos e a seu terno. Ele poderia evitá-los, se pagasse o plano Ouro do espelho.

Dentro do elevador, Zed continua a ser bombardeado por comerciais. Talvez o plano Platinum do condomínio valha a pena para ao menos ter um pouco de paz de manhã. Antes de abrir a porta, o elevador oferece uma enquente: qual dessas marcas você recomendaria?

Zed senta dentro do carro e fecha os olhos por uns segundos. Muitos segundos. Então, ele suspira profudamente e dá o comando para o veículo iniciar.

—Bom dia, Zed. Já completamos mil viagens. Como avalias o Toyota e-5000?
—Podemos simplesmente ir? Tenho uma reunião.
—Neste caso, tenho algumas sugestões de livros sobre como melhor conduzir reuniões corportativas. Todos eles foram avaliados com 5 estrelas.
—Não tenho tempo para isso.
—Se avaliares a última compra, terás direito a um desconto em qualquer um desses livros. Pense bem.
—Ao escritório, já!

O transporte estaciona na vaga a tempo para a reunião, mas Zed ainda precisa avaliar a viagem. Cinco estrelas, apenas para não ter que justificar a avaliação. Bela maneira de conseguir boas avaliações, Zed grunhe entre os dentes, encher a paciência de quem não conceder 5 estrelas.

Ao entrar no elevador, um comercial submersivo acende com luzes fortes as quatro paredes, o piso, e o teto. Zed está um pouco irritado e dá um soco na porta, mas não forte o suficiente, pensa ele, para disparar os sensores de segurança.

O elevador silencia e o restante da subida se dá em silêncio. Que estranho.

Quando as portas finalmente se abrem, elas revelam dois seguranças. Zed é escoltado até o Setor de Incidentes Anti-Corporativos.

A polícia chega meia hora mais tarde e o leva até a delegacia, onde ele é identificado.

Dentro da cela, Zed deita-se e fecha os olhos. Um zumbido conhecido se aproxima: é o robô-recepcionista que ele mesmo projetou e que rendeu trilhões ao seu empregador.

—Bom dia, Zed. Lamento encontrar-te aqui, mas preciso fazer umas perguntas a respeito da abordagem policial desta manhã: que nota darias à limpeza da viatura, de um a dez?; que nota darias à cortesia dos policiais, de nove a dez?; como avaliarias a cela, de um a dez?

Infelizmente, a delegacia não oferece um plano sem comerciais na cela.

quinta-feira, 30 de outubro de 2025

Tampouco

Estou em campanha pela reabilitação da palavra "tampouco". Cada vez que escuto "eu também não", fico um pouco triste e irritado.

Não me parece certo usar um termo inclusivo para marcar uma negação.

Por acaso a minha linguagem de programação favorita, o Perl, tem unless e until para controle de fluxo e as linguagens mais populares não têm algo parecido. Os programadores são obrigados a usar negações nos ifs e whiles. Perde-se um pouco de expressividade e elegância.

Ademais, pode-se utilizá-los como modificadores de uma expressão, o que ajuda a traduzir diretamente um pensamento numa linha de código.



  my $count = 0;
  print "$count\n" until $count++ >= 10;

  print "On air\n" unless $status eq 'Off';

quarta-feira, 15 de outubro de 2025

Taxonomia das Necessidades Humanas

Eu vinha observando que as coisas consideradas de luxo tinham, acima de quaisquer considerações práticas, a qualidade de serem usadas para exibição pública: ostentação. Muitas coisas de luxo sequer são práticas, como carros baixinhos de dois lugares que mal conseguem navegar as ruas acidentadas de nossas cidades.

Após várias discussões filosóficas em família, chegamos à seguinte classificação das coisas que usamos:

  • Necessidade
  • Conforto
  • Privilégio
  • Luxo

Necessidades são as coisas básicas da vida: comida, roupas, um lugar para dormir e tomar banho, etc.

Conforto são as coisas que tornam a vida mais confortável, como água quente, sapatos confortáveis, eletrodomésticos, chuveiro a gás, um carro (em lugares com transporte público insuficiente), etc.

Privilégios são coisas que têm um pouco mais de qualidade, como sabonetes perfumados, oléo de banho francês, um carro japonês confiável, chocolate suíço, etc. Elas nos trazem prazer, mas não chamam a atenção.

Finalmente, luxo são, como anteriormente apontado, objetos ou serviços comprados para serem ostentados: carros importados caros, hotéis de 5 estrelas, roupas de marca, etc. É possível que essas coisas nunca tenham sentido econômico. Os carros da Toyota são reconhecidamente os carros mais confiáveis; carros como Ferraris e Porsches, apesar de serem muito mais caros, não alcançam a longevidade dos Toyotas e, portanto, só têm sentido se usados para ostentação. Os carros da Mercedes igualam a taxa de falha dos Toyotas até 5 anos, depois os Toyotas reinam solitários no topo do ranking da confiabilidade.

Por isso, eu penso que os itens de luxo são mais uma falha ou fraqueza de caráter do que qualquer outra coisa; estão aí para confirmar o sucesso do dono, ou suprir sua necessidade de reconhecimento, ou tentar apagar suas falhas.

O interessante dessa característica definidora do luxo é que ela vale para empresas. Quando surge uma nova moda tecnológica, é comum que seja adotada sem que seja avaliada na escala das necessidades.

Assim entram para as empresas o Big Data e a IA. Ninguém mede a necessidade, mas todos correm para implementar algo para então exibir ao resto da sociedade. A característica mais relevante é que é preciso ter porque os outros têm; o custo e os possíveis benefícios não são avaliados.

Claro que essas exibições de riqueza funcionam em alguma dimensão. Elas criam uma imagem de poder ou de sucesso. Desde sempre os ricos usam o luxo para se diferenciarem. Mas o melhor que uma pessoa ou uma empresa podem fazer é aprender avaliar o que é luxo e o que é necessidade, conforto, ou privilégio. Recursos que sobram podem ser usados para suprir mais necessidades, e mais confortos, e mais privilégios.

segunda-feira, 1 de setembro de 2025

Multiplicação com o Algoritmo de Booth

A multiplicação russa é conhecida no submundo do assembly para 6502 como "shift and add", porque ela reduz a multiplicação a essas duas operações.

Um cidadão inglês chamado Booth notou que quando há sequências de 1s no multiplicador pode-se reduzir o número de operações.

Em poucas palavras, multiplicar x por 15 é igual a multiplicar x por 16 e subtrair x.


1111 * x = x<<3 + x<<2 + x<<1 + x
1111 * x = x<<4 - x

Podem existir várias sequências de 1s no multiplicador.


1110111 * x = x<<6 + x<<5 + x<<4 + x<<2 + x<<1 + x
1110111 * x = (x<<7 - x<<4) + (x<<3 - x)

A implementação é ineficiente e não vale a pena no 6502, talvez porque ele só tenha instruções para fazer um shift por vez. É um milagre que alguém consiga fazer algo com esse processador, mas Turing garante que tudo é possível.

Deve ser por terem convivido com tantas limitações que os criadores do ARM criaram instruções condicionais que fazem aritmética e shifts ao mesmo tempo, tudo numa só instrução.

Mas o que achei curiosa é a possibilidade de usar isso com o sistema decimal.


993.006 * x = 900.000*x + 90.000*x + 3.000*x + 6*x
993.006 * x = (1.000.000*x - 7.000*x) + 6*x

Operando manualmente, o número de adições reduz bastante:


993.006*123 => 123000000
                  161000 -
                     738 +
               122139738 =
               

Esse algoritmo é muito mais interessante no binário, porque a probabilidade de um bit ser zero ou um é de 50%, e, portanto, só vai realmente ajudar com uma classe específica de números decimais, mas é uma maneira interessante de ver a multiplicação.