n個の異なる素因数を持つn番目の数


10

最短関数、プログラム、または算出式作成A073329に、すなわち、a(n)あるn番目持つ数n個の別個の素因数を。入力は、返されるシーケンス内の要素の数です。0 < n。整数の精度には関心がありません。アルゴリズムが欲しいだけです。任意の大きな整数をサポートしていない言語については、サポートするふりをします。

上記のOEISへのリンクをたどることで、テストケースを見つけることができます。

更新:

プログラム、関数、または式から整数シーケンスを返す必要があることを明確にしましょう。つまり、1からまでのすべてf(x)を計算a(n)する必要があります。与えられた8の、あなたの関数が返す必要があり、配列または他の適切なデータ構造として。nxx2, 10, 60, 420, 4290, 53130, 903210, 17687670


限界/限界??
st0le

私は限界や限界にはあまり関心がありませんが、それが重要な場合は、入力が8以下であることを前提にアルゴリズムを実行してください。言ったように、私は特定の言語の整数制限の詳細ではなく、抽象的な数学アルゴリズムに興味があります。
Gregory Higley、

1
多分それは私たちが言うときよりオープンです:output a(1), ... a(n)配列のような何かを返すのではなく...
ユーザー不明

回答:


2

Python、144文字

R=range
P=[x for x in R(2,99)if all(x%i for i in R(2,x))]
for a in R(input()):
 x=n=0
 while n<=a:n+=sum(x%p==0for p in P)==a+1;x+=1
 print x-1

x = 8の場合、実行が完了するまで約2分かかります。


2

Java、1行に170文字

int a(int n) {
    int a = 2, t = a, m = 1, i = 1;
    Set s = new HashSet();
    while (i++ > 0) {
        if (t % i == 0) {
            s.add(i);
            t /= i;
            if (t == 1) {
                if (s.size() == n) {
                    if (n == m) {
                        break;
                    }
                    m++;
                }
                t = ++a;
                s.clear();
            }
            i = 1;
        }
    }
    return a;
}

更新、+ 77文字のIOL

int[] f(int n) {
    int[] f = new int[n];
    for (int i = 0; i < n; i++) {
        f[i] = a(i+1);
    }
    return f;
}

これは実際には正しくありませんが、近いですが、質問をもっと明確にする必要があると思います。整数シーケンスを返す必要があります。たとえば、入力が8の場合、A073329シーケンスの最初の8つの要素を返す必要があります。
Gregory Higley、

@Gregoryのアップデートを見る
cubanacan

申し訳ありません-OEISリンクを読んだ後で明らかになった、タスクに対する私自身の誤解に基づいて、私はあなたを反対票で投票しました。投稿のマイナーな編集をした場合、私は私の反対票を取り消すことができます。
ユーザー不明

@userあなた自身のコメントの誤解のため、リクエストを明確にしてください
cubanacan

私は質問を誤解し、すべての要因は明確な素数でなければならないので、2 * 3 * 5 * 2は間違った答えになると考えました。だから私はあなたの答えを偽りであるとして投票しました。その後、「明確な素数」が理解する方法を発見し、投票を修正したかったのですが、投票を変更することはできません。それは最初の数分でのみ可能です。ただし、回答を編集すると、投票を変更できます。少しだけ編集してください。
ユーザー不明

2

Java(ゴルフなし)

public class M {

    public static void main(String[] a) {
        final int N = 100000000;
        int[] p = new int[N];
        for(int f = 2; f * f < N; f++) {
            if(p[f] == 0)
                for(int k = f; k < N; k += f)
                    p[k]++;
        }
        for(int i = 1; i <= 8; i++) {
            int c = 0, j;
            for(j = 1; j < N && c < i; j++)
                if(p[j] == i)
                    c++;
            if(c == i)
                System.out.println(i + " = " + --j);
        }
    }
}

ふるいアルゴリズムを使用します。それはかなり速いです。(6秒) まで8は正確に機能し、それ以上の場合はおそらく失敗します。


1

JavaScript、149文字

function(n){function f(x){for(r=[],o=x,z=2;z<=o;x%z?++z:(x/=z,r.indexOf(z)+1?0:r.push(z)));return r}for(c=0,i=1;c<n;)f(++i).length==n?c++:0;return i}

n> = 6で応答がないように感じるので、どれほどの時間がかかるかテストしていません(ブラウザが10秒ごとにハングスクリプト通知をポップアップするため、正確に計ることができず、完全にハングアップしたくない場合は、 「今後これを表示しない」をチェックしてください...)

編集:配列を返すには200文字です(+51)

function(n){function F(){function f(x){for(r=[],o=x,z=2;z<=o;x%z?++z:(x/=z,r.indexOf(z)+1?0:r.push(z)));return r}for(c=0,i=1;c<n;)F(++i).length==n?c++:0;return i}for(a=[];n>0;n--)a.push(f());return a}

0

J、32バイト

({"0 1~i.@#)(]/.~#@~.@q:)

しかし、私は自分の質問に答えるのが遅いので、この答えは好奇心として残しておきます。

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