사소한 순서의 비틀기


15

소개

다음과 같이 정의 된 정수 시퀀스 f를 고려하십시오 .

  1. f (2) = 2
  2. 경우 N 다음 홀수 소수이다 (N) = F (F (N-1) + f를 (N + 1)) / 2
  3. 만약 N = P · Q가 다음, 복합체 인 F (N) = F (p) * F (Q)

그것은 것을보고 매우 어렵지 않다 F (N)를 = N 모든에 대한 N ≥ 2 , 따라서 계산 F 매우 흥미로운 도전이 될하지 않을 것입니다. 첫 번째 경우를 반으로 줄이고 두 번째 경우를 두 배로 정의를 바꾸어 봅시다. 다음과 같이 정의 된 새로운 시퀀스 g를 얻습니다 .

  1. g (2) = 1
  2. 경우 N 다음 홀수 소수이며, g (n)은 g = (N-1) + g (N + 1)
  3. 만약 N = P · Q를 합성하고, 다음 g (N) = g (p) · g (Q)

작업

당신의 임무는 입력으로 정수 n ≥ 2 를 취하고 출력으로 g (n) 을 생성하는 것입니다. 정수 오버플로에 대해 걱정할 필요는 없지만 g (1025) = 81을 올바르게 계산할 수 있어야하며 알고리즘은 이론적으로 임의로 큰 입력에 대해 작동해야합니다.

전체 프로그램 또는 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이깁니다.

위에서 g (1025) = 81 이라고 주장 했으므로 직접 계산해 봅시다. 1025 의 소인수 분해 는

1025 = 5*5*41 => g(1025) = g(5)*g(5)*g(41)

41 이 소수 이기 때문에

g(41) = g(40) + g(42)

다음으로, 4042의 소인수 분해를 계산합니다 :

40 = 2*2*2*5 => g(40) = g(2)*g(2)*g(2)*g(5) = g(5)
42 = 2*3*7 => g(42) = g(2)*g(3)*g(7) = g(3)*g(7)

이 작은 소수의 경우

g(3) = g(2) + g(4) = 1 + 1 = 2
g(5) = g(4) + g(6) = 1 + 2 = 3
g(7) = g(6) + g(8) = 2 + 1 = 3

이것은

g(41) = g(40) + g(42) = g(5) + g(3)*g(7) = 3 + 2*3 = 9

g(1025) = g(5)*g(5)*g(41) = 3*3*9 = 81

테스트 사례

g의 최대 값은 50 입니다.

2 -> 1
3 -> 2
4 -> 1
5 -> 3
6 -> 2
7 -> 3
8 -> 1
9 -> 4
10 -> 3
11 -> 5
12 -> 2
13 -> 5
14 -> 3
15 -> 6
16 -> 1
17 -> 5
18 -> 4
19 -> 7
20 -> 3
21 -> 6
22 -> 5
23 -> 7
24 -> 2
25 -> 9
26 -> 5
27 -> 8
28 -> 3
29 -> 9
30 -> 6
31 -> 7
32 -> 1
33 -> 10
34 -> 5
35 -> 9
36 -> 4
37 -> 11
38 -> 7
39 -> 10
40 -> 3
41 -> 9
42 -> 6
43 -> 11
44 -> 5
45 -> 12
46 -> 7
47 -> 9
48 -> 2
49 -> 9
50 -> 9

에 섬뜩하게 유사한 A002487 , 그리고 아직 (다른에서 15, 21, 25, 29, 33, 41, 그리고 무리 더,하지만 난 왜 실제 패턴을 찾을 수 없습니다.)
가브리엘 Benamy

@GabrielBenamy 음, 내 시퀀스도 만족 a(2*n) = a(n)하고,이 a(2*n+1) = a(n) + a(n+1)경우 보유하고 2*n+1소수. 다른 많은 홀수의 경우 시퀀스는 아마도 우연의 일치 일 것입니다.
Zgarb

1 대신 True 를 반환 할 수 있습니까?
Dennis

@Dennis의 과제는 의사 결정 문제가 아니라 숫자 함수를 평가하는 것이므로 그렇게하지 않을 것이라고 가정합니다.
Pavel

1
@Pavel 그래도 큰지지가 있으며 적어도 Python에서는 True 가 모든 의도와 목적에 대해 1 처럼 작동 합니다.
Dennis

답변:


7

하스켈, 69 바이트

x#a|x<3=1|a>x=a#2+(x-1)#2|mod x a<1,a<x=a#2*div x a#2|b<-a+1=x#b
(#2)

사용 예 : (#2) 1025->81

매개 변수 a는 나누 x거나 도달 할 때까지 카운트됩니다 x(즉, x소수). 그것은을위한 테스트 한 바이트 짧은 a > x및 추가 조건 (추가 a < x하는 대신에 대한 테스트의 계수 시험을)를 a == x, 이전 바인딩 때문에 ax+1재귀 호출에 도움이됩니다. 비교:

|a==x=(x+1)#2+(x-1)#2|mod x a<1=
|a>x=a#2+(x-1)#2|mod x a<1,a<x=

4

젤리 , 18 바이트

‘;’Ñ€Sµ1n2$?
ÆfÇ€P

온라인으로 사용해보십시오!

이것은 기본적으로 사양을 직접 번역 한 것입니다. (조금 생각하면 시퀀스를 찾기위한 닫힌 수식이 있으면 직접 접근보다 바이트가 더 많을 것으로 생각됩니다.)

설명

우리는 두 개의 상호 재귀 함수가 있습니다. 다음은 도우미 함수입니다 ( 프라임 n에 대한 g (n) 계산 ).

‘;’Ñ€Sµ1n2$?
           ?  If
        n2$     the input is not equal to 2 (parsed as a group due to $)
      µ       then do all the following (parsed as a group due to µ):
‘;’             Find the list [n+1, n-1];
   р           Call the main program on each element (i.e. [g(n+1),g(n-1)]);
     S          and return the sum of the list (i.e. g(n+1)+g(n-1)).
              Otherwise:
       1        Return 1.

다음 은 모든 n에 대해 g (n) 을 계산하는 기본 프로그램입니다 .

ÆfÇ€P
Æf            Factorize the input into its prime factors;
  ǀ          Call the helper function on each element of that list;
    P         Then take the product.

분명히 우리가 소수에 주 프로그램을 호출하면 모든 것을 제외하고는 no-op 이므로이 경우 g (n)Ç반환합니다 . 프로그램의 나머지 부분은 복합 n 의 동작을 처리합니다 .


4

자바 스크립트 (ES6), 59 바이트

f=(n,d=2)=>n-2?d<n?n%d?f(n,d+1):f(n/d)*f(d):f(n-1)+f(n+1):1

테스트


3

파이썬 2, 85 69 바이트

g=lambda n,k=3:(n&~-n<1)or n%k and g(n,k+2)or(g(k+1)+g(k-1))*g(n/k,k)

3

젤리 , 13 바이트

Æfḟ2µ‘,’߀€SP

온라인으로 사용해보십시오!

작동 원리

Æfḟ2µ‘,’߀€SP  Main link. Argument: n

Æf             Yield the array of prime factors of n.
  ḟ2           Remove all occurrences of 2.
    µ          Begin a new, monadic chain. Argument: A (array of odd prime factors)
     ‘         Increment all elements of A.
       ’       Decrement all elements of A.
      ,        Pair; yield [A+1, A-1].
        ߀€    Map the main link over all elements of A+1 and A-1.
           S   Column-wise reduce by addition.
            P  Reduce by multiplication.

3

클로저, 126 바이트

(defn t[n](if(= n 2)1(let[a(+(.indexOf(for[b(range 2 n)](mod n b)2)0))](if(> a 1)(*(t(/ n a))(t a))(+(t(dec n))(t(inc n)))))))

예이! 파이썬이 응답하는 시간의 거의 두 배입니다!

언 골프와 설명 :

(defn trivial [n]
  ; Define the function.
  (if (= n 2) 1
  ; If the number is 2, return 1
    (let [a (+ 2 (.indexOf (for [b (range 2 n)] (mod n b)) 0))]
      ; Let a be the lowest prime factor of n
      (if (> a 1)
        ; The .indexOf function returns -1 if a is a prime, so -1 + 2 = 1.
        ; Checks if a is a prime.
        (* (trivial (/ n a)) (trivial a))
        ; If a is prime, return the trivial(a/n) * trivial(a).
        (+ (trivial (dec n)) (trivial (inc n)))))))
        ; Else, return trivial(n-1) + trivial(n + 1).

쿨, 난 당신이 할 수 몰랐어요 (.indexOf (for [...] ...) x)!
NikoNyrh

현재 118 바이트 버전은 11 반환 (t 1025)어쩌면, if의도 된 :when? 그러나 nth빈 목록이 발생 IndexOutOfBoundsException합니다.
NikoNyrh

@NikoNyrh 그래, 그런 일은 일어나지 않아야한다-나는 그것을 테스트했고 코드는 유효하지 않다. 원래 버전으로 돌아갑니다.
clismique

2

수학, 83 바이트

Which[#<4,#-1,PrimeQ@#,Tr[#0/@({#-1,#+1}/2)],0<1,1##&@@#0/@Divisors@#~Part~{2,-2}]&

정수를 반환하는 하나의 양의 정수 인수의 이름없는 재귀 함수. 결국 그렇게 짧지는 않습니다. Tr[#0/@({#-1,#+1}/2)](입력이 소수 인 경우) 순서 쌍의 두 멤버에서 함수를 호출 {(#-1)/2,(#+1)/2}하고 결과를 추가합니다. 예를 들어 (#-1)/2및 의 함수 값이 같기 때문에 이것은 #-1좋습니다. 마찬가지로, 1##&@@#0/@Divisors@#~Part~{2,-2}두 번째로 작은 제수 #와 그에 해당하는 제수 (두 번째로 큰 제수) 에서 함수를 호출 하고 답을 곱합니다.


명명되지 않은 재귀 함수는 어떻게 작동합니까?
Pavel

1
대한 섹션을 확인 #0에서 이 답변 .
Greg Martin

2

클로저, 120 바이트

(defn g[n](if(= n 2)1(if-let[F(first(for[i(range 2 n):when(=(mod n i)0)]i))](*(g F)(g(/ n F)))(+(g(dec n))(g(inc n))))))

용도는 :when의 약수를 얻기 위해 n, F이다 nil그런 제수가 발견되지 않는 경우 ( n소수).


다투고 싶습니까? 켜졌 어. (친절한 경쟁?)
clismique

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.