Nel 1919 George Polya congetturò che per ogni numero naturale N, se 2 ≤ N, i numeri naturali tra 2 ed N con un numero pari di fattori primi [maggiori di 1] fossero meno di quelli con un numero dispari di fattori primi [maggiori di 1]. Indichiamo con P e D le loro quantità; quindi P+D = N−1 (ho tolto 1 in quanto parto da 2).  La congettura è, dunque, che D > P, ovvero che D/(P+D) > 1/2, ovvero che D/(N−1) > 1/2.  La cosa trovava conferma nelle molte prove che aveva realizzato.  Questo aprì il problema di dimostrare la cosa o di trovarne un controesempio.  Dopo l'avvento dei computer si provò a studiare il problema sperimentalmente utilizzando opportuni programmi.  Fu solo nel 1980 che Minoru Tanaka, con un programma di questo genere, trovò che la cosa vale solo per i numeri minori di 906 150 257.
Prova a realizzare un programma per effettuare tale studio.  Ecco, a destra, alcune possibili uscite di un programma di tal genere, che al crescere di N calcola il rapporto R = D/(N−1) e stampa i valori di N e R ogni volta che R diminuisce.  Trai spunto dal seguente programma per R più semplice, che determina i fattori primi di 12.
   
2   1
4   0.6666667
6   0.6
10  0.5555556
16  0.5333333
26  0.52
40  0.5128205
95  0.5106383
96  0.5052632
566 0.5044248
568 0.5044092
570 0.5043937
572 0.5043783
573 0.5034965
581 0.5034483
583 0.5034364
584 0.5025729
585 0.5017123
586 0.5008547
##  Algoritmo che scompone n > 1 in numeri primi (se n/k ha un risultato intero
##  allora k è un divisore: n=k*h; lo stampo e mi riduco a trovare i primi di h; ...)
n <- 12; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
#  2  2  3
# IDEA:
# A partire da D=0, per ogni n, da 2 a T, aggiungo 1 se i fattori primi di n sono in
# quantità dispari. Alla fine determino il rapporto tra questo totale D e (T-1)
n <- 2; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 2  - devo calcolare 1/(2-1) = 1
n <- 3; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 3  - devo calcolare (1+1)/(3-1) = 1 (aggiungo 1: 3 ha quantità dispari di fattori primi)
n <- 4; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 2 2  - devo calcolare (1+1)/(4-1) = 2/3 (non aggiungo 1: 4 non ha quantità dispari di …)
n <- 5; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 5  - devo calcolare (1+1+1)/(5-1) = 3/4 (aggiungo …)
n <- 6; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 2 3  - devo calcolare (1+1+1)/(6-1) = 3/5 = 0.6 (non aggiungo …)
n <- 7; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 7  - devo calcolare (1+1+1+1)/(7-1) = 2/3 (aggiungo …)
n <- 8; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 2 2 2  - devo calcolare  (1+1+1+1+1)/(8-1) = 5/7 (aggiungo …)
n <- 9; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 3 3  - devo calcolare (1+1+1+1+1)/(9-1) = 5/8 = 0.625 (non aggiungo …)
n <- 10; k <- 2; while(k <= n) if(n/k==floor(n/k)) {n <- n/k; print(k)} else k <- k+1
# 2 5  - devo calcolare (1+1+1+1+1)/(10-1) = 5/9 = 0.55555 (non aggiungo …)
#
# Ecco una possibile realizzazione del programma richiesto:
a <<- 2
for(t in 2:600) { d <- 0; for(n in 2:t) { m <- 0; k <- 2; while(k <= n)
   if(n/k==floor(n/k)) {m <- m+1; n <- n/k} else k <- k+1; if(floor(m/2) < m/2) d <- d+1};
   if(d/(t-1) < a) {write(c(t,d/(t-1)),file=""); a <- d/(t-1)} }
# In a memorizzo il nuovo valore minimo di R e lo stampo

Questo algortimo (che abbiamo fermato a 600) è molto elementare, ma ci dà un'idea di come si può studiare il problema. Con un algortimo più efficiente, in diverse ore, si potrebbe ottenere che per  906 150 257  R < 1/2.