gli intoccabili


9

Numeri intoccabili α

Un numero intoccabile è un numero intero positivo che non può essere espresso come la somma di tutti i divisori propri di qualsiasi numero intero positivo (incluso il numero intoccabile stesso).

Ad esempio, il numero 4 non è intoccabile in quanto è uguale alla somma dei divisori propri di 9: 1 + 3 = 4. Il numero 5 è intoccabile in quanto non è la somma dei divisori propri di qualsiasi numero intero positivo. 5 = 1 + 4 è l'unico modo per scrivere 5 come somma di interi positivi distinti incluso 1, ma se 4 divide un numero, anche 2 lo fa, quindi 1 + 4 non può essere la somma di tutti i divisori propri di qualsiasi numero (poiché l'elenco dei fattori dovrebbe contenere sia 4 che 2).

Si ritiene che il numero 5 sia l'unico numero insolito intoccabile, ma questo non è stato dimostrato: sarebbe seguito da una versione leggermente più forte della congettura di Goldbach. β

Ci sono infiniti numeri intoccabili, un fatto dimostrato da Paul Erdős.

Alcune proprietà degli intoccabili:

  • Nessun intoccabile è 1 maggiore di un numero primo
  • Nessun intoccabile è 3 maggiore di un numero primo, tranne 5
  • Nessun intoccabile è un numero perfetto
  • Fino ad ora, tutti gli intoccabili a parte 2 e 5 sono compositi.

Obbiettivo

Crea un programma o una funzione che accetta un numero naturale ntramite input standard o parametri di funzione e stampa i primi nnumeri intoccabili.

L'output deve avere una separazione tra i numeri, ma questo può essere qualsiasi cosa (es. Newline, virgole, spazi, ecc.).

Questo dovrebbe essere in grado di funzionare almeno 1 <= n <= 8153. Ciò si basa sul fatto che il file b fornito per la voce OEIS γ arriva fino a n = 8153.

Le scappatoie standard non sono consentite, come al solito.

Esempio I / O

1    -> 2
2    -> 2, 5
4    -> 2, 5, 52, 88
10   -> 2, 5, 52, 88, 96, 120, 124, 146, 162, 188
8153 -> 2, 5, 52, 88, 96, 120, ..., ..., ..., 59996

Questo è , quindi vince il numero minimo di byte.


α - Wikipedia , β - MathWorld , γ - OEIS


Per qualche motivo questo è stato contrassegnato come duplicato della domanda "trovare numeri semiperfetti", tuttavia i compiti sono completamente diversi. In questo caso, è necessario verificare per assicurarsi che nessuna somma di divisori perfetti di qualsiasi numero naturale possa essere uguale a un certo numero.


Questo è puramente speculativo, dal momento che non ho ancora pensato a come risolverei questo problema: sarebbe barare se assumessi un limite superiore sui numeri risultanti? Se scrivessi un codice che trova solo numeri intoccabili fino a 60.000? Ciò sarebbe sufficiente per coprire l'intervallo di input. Ma ovviamente lo so solo sulla base dei risultati parziali forniti.
Reto Koradi,

Immagino che andrebbe bene. Non è tecnicamente difficile codificare i risultati, non viola le scappatoie standard per quanto ne so. Finché si adatta al resto delle specifiche andrà bene.
Kade,

@vihan Assolutamente no.
Kade,

Risposte:


6

Pyth, 21 byte

.f!fqZsf!%TYStTSh^Z2Q

Avvertenza: incredibilmente lento. Esecuzione del test e tempistica di seguito.

$ time pyth -c '.f!fqZsf!%TYStTSh^Z2Q' <<< 3
[2, 5, 52]

real    2m46.463s
user    2m46.579s
sys 0m0.004s

Fondamentalmente è la forza più bruta possibile, testa le fattorizzazioni fino al potenziale numero solitario al quadrato più uno.


4

C, 104 byte

j,i,z,w;u(y){for(z=2;y;z++)for(w=0;(++w<z*z||0&printf("%i ",z)+y--)&&j^z;)for(i=j=0;++i<w;j+=i*!(w%i));}

Ci vorranno alcuni minuti per y > 20, ma comunque.


2

Java, 310 byte

class U{int[] p;U(int e){p=new int[(int)4e9];for(int i=1,c=0;c<e;i++)if(u(i)>0){System.out.println(i);c++;}}int p(int n){if(p[n]!=0)return p[n];int i,s=1;for(i=2;i<=n-1;i++)s+=n%i==0?i+(n/i!=i?n/i:0):0;return(p[n]=s);}int u(int n){if(n==1)return 0;for(int i=2;i<=(n-1)*(n-1);i++)if(p(i)==n)return 0;return 1;}}

Ho giocato a golf meglio che potevo, ma ero più interessato ad assicurarmi che funzionasse in tempi ragionevoli. La versione non modificata è probabilmente più interessante

public class Untouchable {
    int[] properDivisorSumMap;


    public Untouchable(int estimatedMaxium){
        properDivisorSumMap = new int[(estimatedMaxium-1)*(estimatedMaxium-1)];
    }


    public int properDivisorSum(int n){
        if(properDivisorSumMap[n] != 0){
            return properDivisorSumMap[n];
        }

        int sum = 1;
        for(int i=2;i<=(int)Math.sqrt(n);i++){
            if(n%i==0){
                sum+=i;
                if(n/i != i){
                    sum+=n/i;
                }
            }
        }
        properDivisorSumMap[n] = sum;
        return sum;
    }


    public boolean untouchable(int n){
        if(n==1){
            return false;
        }
        for(int i=2;i<=(n-1)*(n-1);i++){
            if(properDivisorSum(i) == n){
                return false;
            }
        } 
        return true;
    }


    public static void main(String[] args){
        Untouchable test = new Untouchable(8480);

        int elements = Integer.parseInt(args[0]);

        for(int i=1,count=0;count < elements;i++){
            if(test.untouchable(i)){
                System.out.printf("%4d: %4d%n",count,i);
                count++;
            }
        }
    }
}

1

Vai, 396 byte

Non proprio golf, ma può fare tutto il range richiesto. Funziona in circa ~ 20 minuti e necessita di ~ 7 GB (indipendente da n). Crea una matrice gigante per calcolare la somma dei divisori per tutti i numeri fino a 59997 quadrati.

func untouchable(n int) {
    const C = 59997
    const N = C * C
    s := make([]uint16, N)
    for d := 1; d < N; d++ {
        for i := 2 * d; i < N; i += d {
            v := int(s[i]) + d
            if v > C {
                v = C + 1 // saturate at C+1
            }
            s[i] = uint16(v)
        }
    }
    var m [C]bool
    for i := 2; i < N; i++ {
        if s[i] < C {
            m[s[i]] = true
        }
    }
    for i := 2; n > 0; i++ {
        if !m[i] {
            println(i)
            n--
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.