Dokunulmazlar


9

Dokunulmaz Sayılar α

Dokunulmaz bir sayı, herhangi bir pozitif tamsayının (dokunulmaz sayının kendisi dahil) tüm uygun bölücülerinin toplamı olarak ifade edilemeyen pozitif bir tamsayıdır.

Örneğin, 4 sayısı, 9: 1 + 3 = 4'ün uygun bölücülerinin toplamına eşit olduğu için dokunulmaz değildir. 5 sayısı, herhangi bir pozitif tamsayının uygun bölücülerinin toplamı olmadığı için dokunulmaz değildir. 5 = 1 + 4, 5'i 1 dahil olmak üzere farklı pozitif tamsayıların toplamı olarak yazmanın tek yoludur, ancak 4 bir sayıyı bölerse, 2 de yapar, bu nedenle 1 + 4, herhangi bir sayının tüm doğru bölmelerinin toplamı olamaz (çünkü faktör listesi hem 4 hem de 2 içermelidir).

5 sayısının tek tuhaf dokunulmaz sayı olduğuna inanılıyor, ancak bu kanıtlanmamıştır: Goldbach varsayımının biraz daha güçlü bir versiyonundan gelecektir. β

Paul Erdős tarafından kanıtlanmış olan sonsuz sayıda dokunulmaz sayı vardır.

Dokunulmazların birkaç özelliği:

  • Dokunulmaz bir asaldan 1 daha büyük değildir
  • Dokunulmaz hiçbir şey bir asaldan 3 daha büyük değildir, 5 hariç
  • Hiçbir dokunulmaz mükemmel bir sayı değildir
  • Şimdiye kadar, 2 ve 5 dışındaki tüm dokunulmazlar kompozittir.

Amaç

Standart giriş veya işlev parametreleri aracılığıyla doğal bir sayı alan ve ilk dokunulmaz sayıları basan bir program veya işlev oluşturun .nn

Çıktının sayılar arasında ayrılması gerekir, ancak bu herhangi bir şey olabilir (yani satırsonu, virgül, boşluk vb.).

Bu en azından çalışabilmelidir 1 <= n <= 8153. Bu b- dosya OEIS giriş için sağlanan gerçeğine dayanmaktadır γ kadar çıkıyor n = 8153.

Standart boşluklar her zamanki gibi izin verilmez.

Örnek G / Ç

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

Bu , böylece en az bayt kazanır.


α - Vikipedi , β - MathWorld , γ - OEIS


Bazı nedenlerden dolayı bu, 'yarı-sayılar bulmak' sorusunun bir kopyası olarak işaretlenmiştir, ancak görevler tamamen farklıdır. Bu durumda, herhangi bir doğal sayının mükemmel bölenlerinin toplamının belirli bir sayıya eşit olmadığından emin olmalısınız.


Bu tamamen spekülatiftir, çünkü bunu nasıl çözeceğimi gerçekten düşünmedim: Sonuçta ortaya çıkan sayılar üzerinde bir üst sınır varsa, hile olur mu? Diyelim ki, sadece 60.000'e kadar dokunulmaz numaralar bulan bir kod yazsaydım? Bu, giriş aralığını kapsamak için yeterli olacaktır. Ama elbette bunu sağladığınız kısmi sonuçlara dayanarak biliyorum.
Reto Koradi

Sanırım sorun olmaz. Sonuçları teknik olarak zor kodlamak değil, bildiğim kadarıyla standart boşlukları ihlal etmiyor. Sürece iyi olacak özelliğin geri kalanına uyduğu sürece.
Kade

@vihan Kesinlikle hayır.
Kade

Yanıtlar:


6

Pyth, 21 bayt

.f!fqZsf!%TYStTSh^Z2Q

Uyarı: İnanılmaz derecede yavaş. Test çalıştırması ve zamanlaması aşağıdadır.

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

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

Temelde olabildiğince kaba kuvvet, potansiyel yalnız kare sayısı artı bire kadar çarpanlara ayırmayı test eder.


4

C, 104 bayt

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

Y > 20 için birkaç dakika sürecek , ama her neyse.


2

Java, 310 Bayt

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

Golf olabildiğince iyi ama, makul sürede koştu emin olmak daha ilgi vardı. Kanlanmamış versiyon muhtemelen daha ilginç

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

Git, 396 bayt

Gerçekten golf değil, ancak gerekli tüm yapabilirsiniz. Yaklaşık ~ 20 dakika çalışır ve ~ 7GB (n'den bağımsız) gerekir. 59997 kareye kadar olan tüm sayılar için bölenlerin toplamını hesaplamak için dev bir dizi yapar.

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--
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.