Introducir la función de $g(n)$ definido por entero positivo argumentos $n$ como el recuento de los cuadrados de los enteros positivos entre los números que se pueden formar tomando algunas larga de los dígitos de la representación binaria de $n$ y la interpretación de esta larga como un número binario. Todas las subsecuencias contribuir.
Por ejemplo, $5 = (101)_2$ y las subsecuencias de los dígitos de $$ (1)_2 = 1, (0)_2 = 0, (1)_2 = 1, (10)_2 = 2, (11)_2 = 3, (01)_1 = 1, (101)_2 = 5$$ y esto incluye a la plaza "uno" tres veces, por lo $g(5) = 3.$
Al $n = 9 = (1001)_2$, se obtienen los siguientes subsecuencias: $$ (1)_2 = 1, (0)_2 = 0, (0)_2 = 0, (1)_2 = 1, (10)_2 = 2, (10)_2 = 2, (11)_2 = 3, (00)_2 = 0, (01)_2 = 1, (01)_2 = 1$$ y $$ (100)_2 = 4, (101)_2 = 5, (101)_2 = 5, (001)_2 = 1, (1001)_2 = 9$$ y esto incluye siete plazas, por lo $g(9) = 7.$
El comportamiento de $g(n)$ es muy errático, que van desde lineal para $n=2^k$ a logarítmica para$n=2^k-1,$, lo que nos motiva a hacer la siguiente pregunta. ¿Cuál es el primer término de la asintótica de expansión de la orden promedio de $g(n)$? I. e. encontrar el asymptotics de $$ \frac{1}{n} \sum_{k=1}^n g(k).$$
Podría ser útil para establecer y demostrar la forma cerrada de expresiones para valores especiales de $g(n)$, por ejemplo, tenemos $g(2^k) = 2^{k-1}$ $g(2^k-1) = k$ como se señaló anteriormente (probar estos). Aquí están los primeros términos de $g(n):$ $$1, 1, 2, 2, 3, 2, 3, 4, 7, 4, 5, 4, 4, 3, 4, 8, 15, 9, 12, 8, 9, 6, 7, 8, 11$$
Este problema no es adecuado para la experimentación numérica debido a $g(n)$ fluctúa rápidamente. Para aquellos que quieran probar de todos modos aquí está un poco de C código. (Iba a memoize esto de la misma manera en que yo memoized el Arce de rutina, pero nunca llegó a hacerlo. Esta es la razón por la que el código se ve como se hace).
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <readline/readline.h> unsigned long long isqrt(unsigned long long n) { si(!n) return 0; unsigned long long a = 1, b = n, a mediados; do { mid = (a+b)/2; si(mediados de*a mediados de>n){ b = centro; } else{ un = centro; } } while(b-a>1); de regreso a; } unsigned long long g(unsigned long long n) { int bits[256], len = 0; while(n>0){ bits[len++] = n%2; n >>= 1; } unsigned long long res = 0, ind; para(ind=0; ind<(1<<len); ind++){ unsigned long long varind = ind; int subseq[256], srcpos=0, pos=0; mientras(varind>0){ si(varind%2){ subseq[pos++] = bits[srcpos]; } srcpos++; varind >>= 1; } unsigned long long val = 0; int seqpos = 0; mientras(seqpos<pos){ val += (1<<seqpos)*subseq[seqpos]; seqpos++; } unsigned long long cs = isqrt(val); if(val>0 && cs*cs == val){ res++; } } return res; } unsigned long long gavg(unsigned long long max) { unsigned long long res = 0, n; para(n=1; n<=max; n++){ res += g(n); } return res; } int main(int argc, char *argv) { unsigned long long max; char *línea; while((linea = readline("> ")) != NULL){ if(sscanf(linea, "%llu", &max)==1){ unsigned long gsum = gavg(máx.); long double asympt = (long double)gsum; asympt = asympt/(long double)max; printf("%llu %lle\n", gsum, asympt); } libre(en línea); } exit(0); }
Este es el Arce de código, que es notablemente más lento.
g := proc(n) opción de recordar; local dlist, ind, flind, sseq, len, sel, val, r, res; dlist := convert(n, base, 2); len := nops(dlist); res := 0; para la ind de 0 a 2^len-1 hacer sel := convert(ind, base, 2); sseq := []; para flind a nops(sel) ¿ si sel[flind] = 1 entonces sseq := [op(sseq), dlist[flind]]; fi; od; val := añadir(sseq[k]*2^(k-1), k=1..nops(sseq)); r := floor(sqrt(val)); si val>0 y r*r = val, a continuación, res := res+1; fi; od; res; end; avg := n -> add(g(k), k=1..n);