quarta-feira, 13 de setembro de 2017

O número em falta

Este problema apareceu no Quora.
"Neste fila
2491771842155490223116351359624312364528611014378220168235412194624714016711713319814428177371372322483356775157513821213812018915616178169180422057425055702049257200441752021649520319463179155401482271358391661117611818617619918524622611214787196431912247122923132852316022867242822118221107236471216824475181150239121712918214915910923798652331532147215125222170494190146216102161182971832061006216327616919791582131417224013622832171920823414111920188116842613237131811954516213053245241210105361242183110491312860155099247920710123810311423018722589102126931061741129193139134341491423011512712511380881921451541731651085920912215220148
estão todos os números entre 1 e 250, menos um, colocados por uma ordem aleatória. Qual é o número em falta?"
Este problema, na sua  simplicidade, levanta algumas questões interessantes, e nem todos olham para ele da mesma maneira...
Eu comecei por querer saber quantos algarismos estão na fila e quantos estariam se os 250 números lá estivessem.
Os computadores servem para fazer estas coisas com muita facilidade (eu gosto de Python, mas qualquer linguagem de programação é boa)

s="2491771842155490223116351359624312364528611014378220168235412194624714016711713319814428177371372322483356775157513821213812018915616178169180422057425055702049257200441752021649520319463179155401482271358391661117611818617619918524622611214787196431912247122923132852316022867242822118221107236471216824475181150239121712918214915910923798652331532147215125222170494190146216102161182971832061006216327616919791582131417224013622832171920823414111920188116842613237131811954516213053245241210105361242183110491312860155099247920710123810311423018722589102126931061741129193139134341491423011512712511380881921451541731651085920912215220148"
print (len(s))
v=""
for i in range (1,251):
    v = v + str(i)
print (len(v))


A primeira instrução de print dá-nos o comprimento da lista dada, 640, e a segunda instrução de print dá-nos o comprimento da lista dos 250 números construída com as instruções anteriores, 642.
Portanto, o número em falta tem dois algarismos, necessariamente iguais, pois se fossem diferentes ficaríamos com duas respostas possíveis.
Não é difícil saber quais são:

for i in range (0, 10):
    cs = 0
    for j in s:
        if j == str(i):
            cs = cs + 1
    cv = 0
    for j in v:
        if j == str(i):
            cv = cv + 1
    print (i, cs, cv)


O resultado deste programa todo é

640
642
0 45 45
1 155 155
2 106 106
3 55 55
4 55 55
5 46 46
6 43 45
7 45 45
8 45 45
9 45 45


(colorido a posteriori) e concluí-se que o número em falta é o 66!

quinta-feira, 7 de setembro de 2017

Fourier no dia a dia

Fourier, transformada de Fourier, tempo e frequência, resposta em frequência, todo um susto para muitos de nós, iniciados ou leigos. No entanto, são conceitos que utilizamos todos os dias.
Quando dizemos que temos um almoço com um determinado grupo uma vez por semana, estamos a fazer uma definição no domínio das freqências!
Sendo a frequência o número de vezes que um evento ocorre por unidade de tempo, é fácil calculá-la. Neste exemplo, se a unidade de tempo for o dia, será 1/7 por dia. Se for a semana, será 1 por semana. Se for o segundo, será 1/7*86400 Hz (a unidade de medida seria o hertz, unidade de medida de frequência do sistema internacional de medidas).
Familiarmente, a electricidade que usamos em nossa casa é proveniente de uma fonte periódica com a frequência de 50 Hz, ou seja, que se repete 50 vezes por segundo.
Claro que a frequência com que ocorre um evento não nos permite localizá-lo no domínio dos tempos. Uma vez por semana? Mas em que dia? Falta o conceito de fase, que tipicamente se exprime como uma fracção do período, ou sob a forma de um ângulo: um período serão 360º ou 2*pi radianos.
No nosso exemplo rudimentar, se a semana se iniciasse à segunda-feira, um evento nesse dia teria fase 0, no dia seguinte, teria fase 1, etc.
A nossa agenda electrónico funciona mais ou menos assim. Existe um registo dos eventos recorrentes, em termos de frequência e fase, mas que queremos depois visualizar no domínio dos tempos. Por exemplo, aqui temos 3 eventos, um todas as semanas, à quarta-feira, outro de duas em duas semanas, à quinta-feira da primeira semana, e um terceiro, de quatro em quatro semanas, à quinta-feira da segunda semana:
Do nosso ponto de vista, interessa-nos normalmente visualizar a agenda no domínio dos tempos
(aqui, só uma vista de seis semanas consecutivas, a partir de uma origem dos tempos arbitrária), e não parece difícil fazer esta conversão. Mas realmente fez-se uma transformada de Fourier inversa!
A transformação no domínio oposto, do tempo para a frequência, seria neste caso mais complicada, mas realmente foram estes problemas que apaixonaram Fourier e Laplace, com os registos das passagens dos astros e a tentativa de os simplificar...