The Untouchables

9

Angka yang Tidak Tersentuh α

Bilangan tak tersentuh adalah bilangan bulat positif yang tidak dapat dinyatakan sebagai jumlah dari semua pembagi yang tepat dari bilangan bulat positif apa pun (termasuk bilangan tak tersentuh itu sendiri).

Misalnya, angka 4 tidak tersentuh karena sama dengan jumlah pembagi yang tepat dari 9: 1 + 3 = 4. Angka 5 tidak tersentuh karena bukan jumlah pembagi yang tepat dari bilangan bulat positif. 5 = 1 + 4 adalah satu-satunya cara untuk menulis 5 sebagai jumlah bilangan bulat positif yang berbeda termasuk 1, tetapi jika 4 membagi angka, 2 juga, jadi 1 + 4 tidak dapat menjadi jumlah semua pembagi yang tepat dari angka mana pun (karena daftar faktor harus mengandung 4 dan 2).

Angka 5 diyakini sebagai satu-satunya angka yang tidak dapat disentuh yang aneh, tetapi ini belum terbukti: itu akan mengikuti versi dugaan Goldbach yang sedikit lebih kuat. β

Ada banyak sekali angka yang tak tersentuh, fakta yang dibuktikan oleh Paul Erd.

Beberapa properti yang tak tersentuh:

  • Tidak tersentuh adalah 1 lebih besar dari perdana
  • Tidak ada yang tidak tersentuh adalah 3 lebih besar dari prime, kecuali 5
  • Tidak tersentuh adalah angka sempurna
  • Hingga saat ini, semua yang tidak tersentuh selain dari 2 dan 5 adalah komposit.

Objektif

Buat program atau fungsi yang mengambil bilangan alami nmelalui input standar atau parameter fungsi dan mencetak nangka-angka pertama yang tidak tersentuh.

Output harus memiliki pemisahan antara angka-angka, tetapi ini bisa berupa apa saja (yaitu baris baru, koma, spasi, dll).

Setidaknya ini harus bisa bekerja 1 <= n <= 8153. Ini didasarkan pada kenyataan bahwa file-b yang disediakan untuk entri OEIS γ naik ke n = 8153.

Celah standar tidak diizinkan, seperti biasa.

Contoh 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

Ini adalah , jadi paling tidak jumlah byte yang menang.


α - Wikipedia , β - MathWorld , γ - OEIS


Untuk beberapa alasan, ini ditandai sebagai duplikat untuk pertanyaan 'menemukan angka semiperfect', namun tugasnya sangat berbeda. Dalam hal ini, Anda harus memeriksa untuk memastikan bahwa tidak ada jumlah pembagi sempurna dari setiap bilangan asli dapat sama dengan bilangan tertentu.

Kade
sumber
Ini murni spekulatif, karena saya belum benar-benar berpikir tentang bagaimana saya akan menyelesaikan ini: Apakah akan curang jika saya mengasumsikan batas atas pada angka yang dihasilkan? Katakanlah, jika saya menulis kode yang hanya menemukan angka tak tersentuh hingga 60.000? Itu sudah cukup untuk mencakup rentang input. Tapi tentu saja saya hanya tahu itu berdasarkan hasil parsial yang Anda berikan.
Reto Koradi
Saya kira itu akan baik-baik saja. Secara teknis ini bukan hardcoding hasilnya, tidak melanggar celah standar sejauh yang saya tahu. Asalkan cocok dengan sisa spek yang akan baik-baik saja.
Kade
@ Vihan Jelas tidak.
Kade

Jawaban:

6

Pyth, 21 byte

.f!fqZsf!%TYStTSh^Z2Q

Peringatan: Sangat lambat. Uji coba dan waktunya di bawah.

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

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

Ini pada dasarnya sekuat tenaga, menguji faktorisasi hingga jumlah potensial yang sepi ditambah satu.

isaacg
sumber
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));}

Diperlukan beberapa menit untuk y > 20, tetapi apa pun.

Oberon
sumber
2

Java, 310 Bytes

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;}}

Bermain golf sebaik yang saya bisa, tetapi saya lebih tertarik untuk memastikan itu berjalan dalam waktu yang wajar. Versi unglofed mungkin lebih menarik

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++;
            }
        }
    }
}
ankh-morpork
sumber
1

Pergi, 396 byte

Tidak benar-benar bermain golf, tetapi dapat melakukan semua rentang yang diperlukan. Berjalan sekitar ~ 20 menit dan kebutuhan ~ 7GB (independen n). Membuat array raksasa untuk menghitung jumlah pembagi untuk semua angka hingga 59997 kuadrat.

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--
        }
    }
}
Keith Randall
sumber