Una prueba de que las expansiones decimales finitas no funcionan. Según The Penguin Dictionary of Curious and Interesting Numbers, p. 60, por Wells ( Referencia de Mathworld ) $$\text{Length of decimal period}\left(\frac{1}{2^a5^b}\right)=\max(a,b)$$
Caso 1: Supongamos que $a\ge b$ . Tenemos que la suma de dígitos no es más que $9a$ .
Por hipótesis de inducción si $2^a5^0>9a$ y $a>1$ $$2^{a+1}>18a=9(a+a)>9(a+1)$$ Desde $2^65^0>9\times6$ , $2^a5^b>9a$ sigue para cada $a\ge6$ y todo lo que no es negativo $b$ .
Por lo tanto, si $a\ge b$ , $a\ge6$
$$2^a5^b>\text{Sum of digits of decimal expansion}\left(\frac{1}{2^a5^b}\right)$$ Caso 2: $a<b$ .
Por hipótesis de inducción si $5^b2^0>9b$ y $b>1$ $$5^{b+1}>45b=9(b+4b)>9(b+1)$$ Desde $5^62^0>9\times6$ , $2^a5^b>9b$ sigue para cada $b\ge6$ y todo lo que no es negativo $a$ .
Por lo tanto, si $a<b$ , $b\ge 6$
$$2^a5^b>\text{Sum of digits of decimal expansion}\left(\frac{1}{2^a5^b}\right)$$
Así que son como máximo $5\times5=25$ casos para comprobar $1\le a,b \le 5$ que son fáciles de hacer. No tenemos esas restricciones si la repetición es periódica, ya que la longitud del período de $1/p$ es como máximo $p-1$ y obviamente $p<9(p-1)$ .
Edición del código : Teniendo en cuenta también los dígitos de partida, y compilando con -O3 se ejecuta en 17 minutos para comprobar la conjetura hasta $100000$ . La complejidad sigue siendo $O(n^2)$ para probar un intervalo $[0-n]$ (Porque se tarda alrededor de $O(k)$ para comprobar si cada $k$ cumple los requisitos). Los valores notificados son $1$ , $3$ y $8$ .
#include <cstdio>
#include <ctime>
#include <map>
int main(){
clock_t t = clock();
printf("Testing 1-9999\n");
printf("1 is a solution!\n"); /*He is just a special kid, the fact that he has
no decimal digits doesn't make you better.They tell him he is the only one.*/
clock_t innert = clock();
for(int x=2;x<100000;++x){
if(x%10000==0){
printf ("It took me %f seconds.\n",((float)(clock()-innert))/CLOCKS_PER_SEC);
printf("Testing %d-%d\n",x,x+9999);
innert=clock();
}
std::map<int,int> residues;
int result=0,residue=1;
while((!residues.count(residue))&&residue){
residues[residue]=1;//dummy value
result+=(residue*10)/x;
residue=(residue*10)%x;
}
if(result==x)
printf("%d is a solution!\n",result);
}
t = clock() - t;;
printf ("Total: It took me %f seconds.\n",((float)t)/CLOCKS_PER_SEC);
return 0;
}