n 개의 고유 한 소수를 갖는 n 번째 수


10

최단 계산하는 함수, 프로그램, 또는 식 작성 A073329 즉, a(n)은 IS 제 n 갖는 수 N 구별 소인수. 입력은 반환 할 시퀀스의 요소 수입니다. 0 < n. 정수 정밀도에 관심이 없습니다. 나는 단지 알고리즘을 원한다. 임의의 큰 정수를 지원하지 않는 언어의 경우 척하는 척합니다.

위에 제공된 OEIS 링크를 따라 테스트 사례를 찾을 수 있습니다.

최신 정보:

프로그램, 함수 또는 표현식에서 정수 시퀀스 를 반환해야한다는 것을 분명히하겠습니다 . 즉, f(x)계산해야 a(n)모든 n일에서까지 x. x8이 주어지면 함수는 2, 10, 60, 420, 4290, 53130, 903210, 17687670배열 또는 다른 적절한 데이터 구조로 반환되어야합니다 .


한계 / 경계 ??
st0le

나는 한계와 한계에 관심이 없지만, 그것이 중요하다면 입력이 8을 넘지 않는다고 가정하고 알고리즘을 수행하십시오. 우리는 더 높은 숫자를 위해 작동한다고 가정합니다. 내가 말했듯이, 나는 특정 언어의 정수 제한의 세부 사항이 아니라 추상적 수학 알고리즘에 관심이 있습니다.
그레고리 히 글리

1
우리가 말할 때 아마, 더 열려 : output a(1), ... a(n)대신 반환 뭔가의 배열처럼 ...
사용자 알려지지는

답변:


2

파이썬, 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, 한 줄에 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보기
쿠바 나칸

죄송합니다. OEIS 링크를 읽은 후 명확하게 밝혀진이 작업에 대한 오해를 바탕으로 투표를했습니다. 게시물을 약간만 수정하면 다운 보트를 취소 할 수 있습니다.
사용자가 알 수 없음

@user 귀하의 코멘트 내 자신의 오해 때문에, 귀하의 요청을하시기 바랍니다 명확히
쿠바 나칸

나는이 질문을 오해하고 모든 요소가 뚜렷한 소수이어야한다고 생각했기 때문에 2 * 3 * 5 * 2는 오답입니다. 그래서 나는 거짓으로 당신의 대답에 투표했습니다. 그런 다음 '명백한 소수'를 이해하고 투표를 수정하고 싶었지만 투표를 변경할 수는 없었습니다. 처음 몇 분만에 가능합니다. 그러나 답변을 수정하면 투표를 변경할 수 있습니다. 약간의 편집 만 부탁합니다.
사용자가 알 수 없음

2

자바 (비 골프)

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 초) upto 8에 대해 정확하게 작동하고 더 높은 값에 대해서는 실패합니다.


1

자바 스크립트, 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.