반복 된 phi 시퀀스


13

관련 : 반복 된 phi (n) 함수 .

당신의 도전은 반복 된 phi 함수를 계산하는 것입니다 :

f(n) = number of iterations of φ for n to reach 1.

오일러의 참을성있는 기능φ 은 어디에 있습니까 ?

관련 OEIS .

그래프는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


규칙 :

목표는에서로 출력 f(n)하는 n=2n=100입니다.

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.

확인할 수있는 값은 다음과 같습니다.

1, 2, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 5, 3, 4, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 6, 4, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 4, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 5, 6, 7, 5, 7, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 7, 5, 6, 6

@LuisMendo 고정하고 확인하기 위해 그래프 + 값을 추가했습니다. :-)
Simply Beautiful Art

1
내가 편집 한 콜 모고 로프 - 복잡성 이 기본적으로 고정 된 값이 출력 될 때, 태그
케어 드 coinheringaahing

1
@SimplyBeautifulArt 먼저 특정 고정 숫자 x와 같은 유한 한 값이 있음을 증명하십시오 phi(x).
user202729

2
이것은 좋은 도전이지만 f(n), 고정 된 수의 범위에서 실행하는 것보다는 구현할 솔루션을 요청하는 것이 좋습니다. 바이트 수가 적은 범위에서 함수를 적용 할 수있는 능력을 가진 언어들 사이에도 차이가 있습니다 (부분 카멜레온 도전?)
Uriel

1
: P 당신에게 이점을주기 위해 도전을 바꿔야한다는 것을 의미합니까? 이러한 규칙이 어떻게 표현되는지에 관계없이 일부 언어는 이점이 있고 일부 언어는 그렇지 않습니다. @Uriel
Simply Beautiful Art

답변:


10

하스켈 , 53 52 바이트

1 바이트를 절약 해 주셔서 감사합니다.

f<$>[2..100]
f 1=0
f n=1+f(sum[1|1<-gcd n<$>[1..n]])

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

sum[1|1<-gcd n<$>[1..n]]부여합니다 φ(n)(에서 촬영 flawr 감사!)

f재귀 함수는 그 계산 1+φ(n)N이 아닌 경우 1, 그리고 출력이 0경우 n이다 1더 반복이 존재하지 않기 때문에, 촬영에 도달 할1

마지막으로 각 요소에 적용되는 f<$>[2..100]목록을 만듭니다.f[2..100]


7

하스켈 , 70 69 68 바이트

이 함수 (\n->sum[1|1<-gcd n<$>[1..n]])는 우리가 익명 함수에 반복적으로 적용하는 totient 함수입니다. -1 바이트를위한 @laikoni에게 감사합니다!

편집 : 방금 @xnor가 이전의 도전 에서이 정확한 유능한 기능을 사용한다는 것을 알았습니다 .

length.fst.span(>1).iterate(\n->sum[1|1<-gcd n<$>[1..n]])<$>[2..100]

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


1
이것은 끈질긴 빌트인이 없기 때문에 꽤 짧습니다!
Luis Mendo

1
@LuisMendo H.PWiz는 더 짧은 솔루션을 찾았 습니다 !
flawr

7

MATL , 16 15 바이트

99:Q"@`_Zptq}x@

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

설명

99:       % Push [1 2 ... 99]
Q         % Add 1 element-wise: gives [2 3 ... 100]
"         % For each k in that array
  @       %   Push k
  `       %   Do...while
    _Zp   %     Euler's totient function
     tq   %     Duplicate, subtract 1. This is the loop condition
  }       %   Finally (execute on loop exit)
  x       %     Delete
  @       %     Push latest k
          %   End (implicit)
          % End (implicit)
          % Display stack (implicit)

이전 버전, 16 바이트

99:Qt"t_Zp]v&X<q

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

설명

99:       % Push [1 2 ... 99]
Q         % Add 1 element-wise: gives [1 2 ... 100]
t"        % Duplicate. For each (i.e. do the following 100 times)
  t       %   Duplicate
  _Zp     %   Euler's totient function, element-wise
]         % End
v         % Concatenate vertically. Gives a 100×100 matrix
&X<       % Row index of the first minimizing entry for each column.
          % The minimum is guaranteed to be 1, because the number of
          % iterations is more than sufficient.
q         % Subtract 1. Display stack (implicit)

1
출력 된 값이 하나씩 꺼져 있습니다. 온라인에서 사용해보십시오! 보정한다은 (하지만 난 ... 전에 이렇게 MATL을 사용한 적이) 것을
coinheringaahing 케어 드

내 게시물의 끝을 확인하십시오. 예상되는 출력을 제공하며 각각에 대해 하나씩 꺼져 있습니다.
Simply Beautiful Art

현재의 대답에 의해 출력 된 처음 5 개 값은 2 3 3 4 3도전 그들이해야 말할 때,1 2 2 3 2
coinheringaahing 케어 드

@cairdcoinheringaahing and SimplyBeautifulArt 아, 알겠습니다. 감사! 이제 수정
Luis Mendo

6

젤리 , 12 11 10 9 바이트

³ḊÆṪÐĿ>1S

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

HyperNeutrino 덕분에 -1 바이트!

Mr. Xcoder 덕분에 -1 바이트!

Dennis 덕분에 -1 바이트

작동 원리

³ḊÆṪÐĿ>1S - Main link. No arguments
³         - Yield 100
 Ḋ        - Dequeue. Creates the list [2, 3 ... 99, 100]
    ÐĿ    - For each element, while the results of the next function
          - aren't unique, collect the results...
  ÆṪ      -   Next function: Totient
      >1  - Greater than one?
        S - Sum the columns

이것이 Dennis에 의해 만들어 졌기 때문에, 나는 이것이 왜 작동 하는지 전혀 알지 못합니다.


1
세 가지 답변 출력을 목록 @dylnan f(n)에서 2대상을 100, 나는이 올바른 버전이라고 생각하도록 질문은, 입력을 언급하지 않습니다
케어 드 coinheringaahing

@dylnan 문제는 출력 요구 f에 대한 n=2n=100단지 하나 개의 값.
Simply Beautiful Art

당신은 맞습니다, 나는 도전의 시작을 읽고 규칙 부분을 명확하게 읽지 않았습니다
dylnan

그리고 코드와 관련 #하여이 경우 에 사용할 수 있습니까? 이와 같은 (명확하게 작동하지 않지만 구문을 명확하게 이해하는 사람이 작성했습니다!)
dylnan

@dylnan 아마도 고정 목록을 생성 할 때 각 요소에 적용하는 것이 일반적으로보다 낫습니다 #.
caird coinheringaahing

6

APL (Dyalog) , 50 29 25 바이트

'내가 봐, 내장 된 강요가 없어!

@ H.PWiz 덕분에 4 바이트 절약

{⍵=1:01+∇+/1=⍵∨⍳⍵}¨1+⍳99

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

어떻게?

분명히 나는 ​​길고 힘든 계급 공식에 먼저 갔다. 개정 내역을 참조하십시오.

⍳⍵- 1n

⍵∨ -와 함께 gcd n

1= -1과 같습니까?

+/ -모두 합쳐

이것은 끈기입니다. 나머지는 계산 ( 1+∇) 및 범위 2..100( ¨1+⍳99) 에 적용 하기위한 래퍼입니다 .



4

J REPL, 23 바이트

<:#@(5&p:^:a:)"0|2+i.99

확인하지는 않았지만 명사로 정의하면 정규 J로 작동합니다 (REPL의 전화로 골프를 쳤습니다).

빌트인, 요

나는 적어도 2 ~ 3 바이트가 면도해야 한다고 말하고 싶습니다 ( a:작동 방식, |noop 로 사용해야 하는 방식으로 인해 하나씩 ).


1
+/*<:5&p:^:a:2+i.99 19 바이트 동안 온라인으로 사용해보십시오!
Galen Ivanov

향후 참조 할 수 아소 사용할 수있는 "+대신 "0이 동등하게 될 수 있도록,<:#@(5&p:^:a:)"+i.99
코너 오브라이언

2
16시+/1<a:5&p:2+i.99
마일

1
@ 마일 : a:코드에서 의 사용법을 설명 할 수 있습니까 ? 대신 어떻게 작동 ^:합니까?
Galen Ivanov

1
@GalenIvanov (5&p:)^:a: m는 dyad가 명사와 결합 된 후 dyadically로 호출 될 때 a: 5&p: m의 다른 정의 를 사용하여 수행 할 수 있습니다 &.
마일

4

JavaScript (ES6), 115 ... 104 99 바이트

하드 코딩은 더 짧을 수 있지만 순수한 수학적 접근을 시도해 봅시다.

f=n=>n>97?6:(P=(n,s=0)=>k--?P(n,s+(C=(a,b)=>b?C(b,a%b):a<2)(n,k)):s>1?1+P(k=s):1)(k=n+2)+' '+f(-~n)

console.log(f())


하드 코딩은 90 바이트입니다 ( pastbin link )
Herman L

@HermanLauenstein 잘 했어요.
Arnauld


3

파이썬 2 , 82 바이트

l=0,1
exec"n=len(l);p=2\nwhile n%p:p+=1\nl+=l[p-1]+l[n/p]-n%4%3/2,;print l[n];"*99

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

이것은 다음과 같은 관찰을 사용합니다.

  • f(a*b) = f(a) + f(b) - 1상기 제외 -1한다면 생략 a하고 b양쪽 모두 고르게
  • f(p) = f(p-1) + 1p프라임f(2)=1

이러한 의미하는 경우 n소인수 분해를 가지고 n = 2**a * 3**b * 5**c * 7**d * 11**e * ..., 다음 f(n) = max(a,1) + b + 2*c + 2*d + 3*e + ..., 여기서 각 p>2인수 분해의 기여에서 f(p-1).

이것들이 과거를 계속 유지하고 있는지 확실 n=100하지 않지만, 그렇다면을 f사용하지 않고 정의하고 계산하는 방법을 제공합니다 φ.


2

풍선 껌 , 49 바이트

00000000: 5d88 0511 0020 0003 ab2c 024e ff64 e8a3  ].... ...,.N.d..
00000010: 379f 956b f05d 206c 0545 7274 743a b876  7..k.] l.Ertt:.v
00000020: 2267 27f9 9f4d 9b9d fc85 e7e6 994d 6eb0  "g'..M.......Mn.
00000030: 2b                                       +

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


2

PowerShell , 110 바이트

$a=,0*101;2..100|%{$i=$_;for($z=$j=0;++$j-lt$i;$z+=$k-eq1){for($k=$j;$j%$k-or$i%$k;$k--){}};($a[$i]=$a[$z]+1)}

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

수학적 접근.

실제로, C answer 와 매우 유사 하지만 독립적으로 개발했습니다. 어레이 작성 0,들로부터 루프 2100하고 계산 phi은 USING gcd제형. 끝 부분의 구획 단위는 결과를 $a다음 이동에 저장하고 파이프 라인에 사본을 배치하여 암시 적 출력을 생성합니다.


PowerShell, 112 바이트

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

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

하드 코딩되었습니다. hum 약 10-15 바이트만큼 수학적 접근법을 얻을 수있는 것보다 짧습니다.


모든 숫자가 한 자리수이므로 실제로 구분 기호가 필요한지 궁금합니다.)
flawr

1
수학적 접근법을 보여줄 수 있습니까? 훨씬 더 흥미롭게 보인다 : P
Conor O'Brien

2
@ ConorO'Brien 운 좋게도, 오늘 아침에 신선한 눈으로보고 하드 코딩 된 접근법 아래에서 수학적인 접근법을 골프로 칠 수있었습니다.
AdmBorkBork


2

껍질 , 10 17 바이트

mö←LU¡Sȯṁε⌋ḣtḣ100

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

편집 : 함수 계산 A003434 이전에 요청 된 범위에서 함수를 실제로 매핑하기위한 +7 바이트 .

설명

다음은 A003434를 계산 합니다 .

←LU¡S(ṁ(ε⌋))ḣ -- takes a number as input, for example: 39
   ¡          -- iterate the following function on the input: [39,24,8,4,2,1,1,1..]
    S(     )ḣ --   with itself (x) and the range [1..x]..
      ṁ(  )   --   ..map and sum the following
        ε⌋    --     0 if gcd not 1 else 1
  U           -- longest unique prefix: [39,24,8,4,2,1]
 L            -- length: 6
←             -- decrement: 5

m(....)ḣ100부분은 [2..100] 범위에서 해당 기능을 매핑하기 만합니다.


1

PHP, 98 바이트

1,2,<?=join(',',str_split(unpack('H*','##3444E4DEEDEEUUEEVEUVUVVFUVVUfVfVVVVVegWVgVffgV')[1]))?>,6

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

모든 숫자를 이진 문자열로 압축했습니다. 압축을 풀고 배열로 변환 한 다음 배열을 다시 병합 한 후 1, 2를 앞에 붙이고 6을 추가하면 제어 코드가 표시되지 않습니다.



1

05AB1E , 11 바이트

тL¦ε[DNs#sÕ

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

설명

тL¦           # push range [2 ... 100]
   ε          # apply to each
    [         # start a loop
     D        # duplicate the current number
      N       # push the loop iteration counter
       s      # swap one copy of the current number to the top of the stack
        #     # if true, break the loop
         s    # swap the second copy of the current number to the top of the stack
          Õ   # calculate eulers totient

1

C, 112 바이트

a[101];f(i,j,k,t){for(a[i=1]=0;i++<100;printf("%d ",a[i]=a[t]+1))for(t=j=0;++j<i;t+=k==1)for(k=j;j%k||i%k;k--);}

언 골프 드 :

a[101];
f(i,j,k,t){
    for(a[1]=0,i=2;i<=100;i++) {   // initialize
        for(t=j=0;++j<i;t+=k==1)   // count gcd(i, j) == 1 (t = phi(i))
            for(k=j;j%k||i%k;k--); // calculate k = gcd(i, j)
        printf("%d ",a[i]=a[t]+1); // print and store results
    }
}

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


0

알루 민 , 87 바이트

hhhhhdadtqdhcpkkmzyhqkhwzydqhhwdrdhhhwrysrshhwqdrybpkshehhhwrysrarhcpkksyhaydhehycpkkmr

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

설명

hhhhhdadt      CONSTANT 100

RANGE FROM 100 to 0
q
  dhc
p

REMOVE 0 AND 1
kk

OVER EACH ELEMENT...
m
  zyh
  q
    kh
    wzyd
    q
      DUPLICATE TOP TWO ELEMENTS...
      hhwdrdhhhwrysrshhw
      GCD...
      qdryb
    p
    ks
    he
    hhhw
    ry
    s
    rarhc
  p
  IS IT ONE? IF SO TERMINATE (FIXPOINT)
  kksyhaydhehyc
p
kk
m
REVERSE THE VALUES
r

0

Pyth, 38 바이트 (비경쟁)

.e-+1sl+1kb_jC"Éõ4ÕYHø\\uÊáÛ÷â¿"3

Pyth Herokuapp 에서 시도하십시오. 왜냐하면 어떤 이유로 든 TIO에서 작동하지 않기 때문입니다.

명백한 Pyth 솔루션이 더 작은 것은 의심의 여지가 없지만 시퀀스를 압축하여 코드를 얻을 수있는 작은 크기를보고 Pyth를 배우고 싶었습니다. 이것은 시퀀스의 상한이라는 사실을 사용합니다 log2(n)+1.

설명

.e-+1sl+1kb_jC"Éõ4ÕYHø\\uÊáÛ÷â¿"3
             C"Éõ4ÕYHø\\uÊáÛ÷â¿"   interpret string as base 256 integer
            j                   3  convert to array of base 3 digits
           _                       invert sequence (original had leading 0s)
.e                                 map with enumeration (k=index, b=element)
       +1k                                   k+1
     sl                            floor(log(   ))
   +1                                             +1
  -       b                                         -b

압축 된 문자열을 통해를 Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3입력했습니다.이 유형은 몇 가지 유형 변환으로 위 코드와 반대입니다.


1
왜 경쟁이 아닌가?
Simply Beautiful Art

@SimplyBeautifulArt는 공식적인 의미에서 비경쟁을 의미하지는 않았다. 그 더 명확하게 제목 편집
stellatedHexahedron

0

옴 v2 , 41 바이트

“ ‽W3>€þΣÌιZ§Á HgüυH§u·β}Bā€ΣNπáÂUõÚ,3“8B

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

문자 그대로 완전히 하드 코딩되었습니다 ... 실제로 위의 시퀀스를 취하여 숫자가 아닌 모든 것을 제거하고 8 진수로 해석 한 다음 옴의 기본 255 숫자 표현으로 바꿨습니다. 그것이 따옴표가하는 일입니다. 그런 다음 프로그램은이를 다시베이스 8로 바꿉니다.

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