アンタッチャブル


9

アンタッチャブルナンバーズα

触れられない数は正の整数であり、正の整数(触れられない数自体を含む)の適切な除数すべての合計として表すことはできません。

たとえば、数値4は、9の適切な除数の合計に等しいため、変更不可ではありません。1+ 3 =4。数値5は、正の整数の適切な除数の合計ではないため、変更不可です。5 = 1 + 4は、1を含む明確な正の整数の合計として5を書き込む唯一の方法ですが、4が数値を除算すると、2も除算されるため、1 + 4は、任意の数値の適切な除数すべての合計になることはできません。因子のリストには4と2の両方が含まれている必要があります。

数字の5は変更できない唯一の奇数であると考えられていますが、これは証明されていません。それは、ゴールドバッハ予想のわずかに強いバージョンから続くでしょう。β

ポールエルデスによって証明された事実は、無数の手に負えない数です。

アンタッチャブルのいくつかのプロパティ:

  • アンタッチャブルは素数よりも1だけ大きい
  • アンタッチャブルは5を除いて素数より3大きい
  • 手に負えないものは完璧な数ではない
  • これまでは、2と5以外のすべてのアンタッチャブルはコンポジットです。

目的

標準入力または関数パラメーターを介して自然数を取り、最初の変更不可能な数を出力するプログラムまたは関数を作成します。nn

出力では数字を分離する必要がありますが、これは何でもかまいません(つまり、改行、コンマ、スペースなど)。

これは少なくとも機能するはず1 <= n <= 8153です。これは、B-ファイルがOEISエントリのために提供するという事実に基づいているγに上がりますn = 8153

通常通り、標準の抜け穴は許可されていません。

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

これはなので、最小バイト数が優先されます。


α- ウィキペディア β- MathWorld γ- OEIS


何らかの理由で、これは「半完全数を見つける」質問の重複としてマークされましたが、タスクは完全に異なります。この場合、自然数の完全除数の合計が特定の数と等しくないことを確認する必要があります。


私はまだこれをどのように解決するかについて本当に考えていなかったので、これは純粋に推測的なものです。たとえば、私が60,000までの編集不可能な数だけを見つけるコードを書いたとしたら?これで入力範囲をカバーできます。しかしもちろん、私はあなたが提供した部分的な結果に基づいてそれを知っているだけです。
Reto Koradi 2015

大丈夫だと思います。これは技術的に結果をハードコーディングするものではなく、私が知る限り、標準の抜け穴に違反するものではありません。それがうまくいく残りのスペックに合う限り。
2015

@vihan間違いなく。
2015

回答:


6

Pyth、21バイト

.f!fqZsf!%TYStTSh^Z2Q

警告:信じられないほど遅い。以下のテスト実行とタイミング。

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

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

それは基本的に可能な限り力ずくであり、潜在的な孤独な数の二乗プラス1までの因数分解をテストします。


4

C、104バイト

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の場合は数分かかりますが、何でもかまいません。


2

Java、310バイト

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

できる限りゴルフをしましたが、妥当な時間内に確実に実行されるようにすることにもっと興味がありました。素朴なバージョンはおそらくもっと興味深いです

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

Go、396バイト

実際にはゴルフをしていませんが、必要な範囲のすべてを行うことができます。約20分で実行され、7 GBを必要とします(nとは無関係)。59997の2乗までのすべての数値の約数の合計を計算する巨大な配列を作成します。

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--
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.