최대 소수 지수


22

integer가 주어지면 n >= 2소인수 분해에서 가장 큰 지수를 출력합니다. OEIS 시퀀스 A051903 입니다.

하자 n = 144. 소인수 분해는 2^4 * 3^2입니다. 최대 지수는 4입니다.

테스트 사례

2 -> 1
3 -> 1
4 -> 2
5 -> 1
6 -> 1
7 -> 1
8 -> 3
9 -> 2
10 -> 1
11 -> 1
12 -> 2
144 -> 4
200 -> 3
500 -> 3
1024 -> 10
3257832488 -> 3

답변:







4

파이썬 2 , 78 바이트

n=input()
e=m=0
f=2
while~-n:q=n%f<1;f+=1-q;e=q*-~e;m=max(m,e);n/=f**q
print m

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

ovs 덕분에 -5 .

이 답변은 프라임 검사를 수행하지 않습니다. 대신, 소인수의 최고 지수가 숫자의 인수 분해에서 다른 요소의 지수보다 크거나 같다는 사실을 이용합니다.



@ovs 덕분에, 내가 빨리 게시하려고하는 동안 놓쳤다
Erik the Outgolfer


@ovs는 드디어 if / else에서 긴장을
풀었습니다

4

apt -h , 9 7 바이트

k ü mÊn

시도 해봐

k ü mÊn     :Implicit input of integer
k           :Prime factors
  ü         :Group by value
    m       :Map
     Ê      :  Length
      n     :Sort
            :Implicit output of last element

2
나는 이것이 더 짧아야한다고 생각합니다. 아마도 소수 지수 쌍을 위해 내장을 추가해야 할 것입니다.
ETHproductions

정렬 함수 대신 "ü : Group by value"를 사용하는 이유는 무엇입니까? 아마도 sort가 하나의 배열을 반환하기 때문에 하나의 배열이 필요하기 때문에 ...
RosLuP

1
정확히 @RosLuP; ü동일한 값의 하위 배열을 만듭니다. 그것은 않는 첫 번째 정렬 값으로도 있지만, 여기서는 관련이없는입니다.
얽히고 설킨






2

자바 스크립트 54 바이트

* 무한 스택 가정 (코드 골프 과제에서와 같이)

P=(n,i=2,k)=>i>n?k:n%i?k>(K=P(n,i+1))?k:K:P(n/i,i,-~k)

console.log(P(2 )== 1)
console.log(P(3 )== 1)
console.log(P(4 )== 2)
console.log(P(5 )== 1)
console.log(P(6 )== 1)
console.log(P(7 )== 1)
console.log(P(8 )== 3)
console.log(P(9 )== 2)
console.log(P(10 )== 1)
console.log(P(11 )== 1)
console.log(P(12 )== 2)
console.log(P(144 )== 4)
console.log(P(200 )== 3)
console.log(P(500 )== 3)
console.log(P(1024 )== 10)
//console.log(P(3257832488 )== 3)






1

가이아 , 4 바이트

ḋ)⌠)

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

  • -소인수 분해를 [프라임, 지수] 쌍 으로 계산합니다 .

    • -최대 값으로 결과를 매핑하고 수집합니다.

    • ) -마지막 요소 (지수).

    • ) -마지막 요소 (최대 지수)

가이아 , 4 바이트

ḋ)¦⌉

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

  • -소인수 분해를 [프라임, 지수] 쌍 으로 계산합니다 .

    • -마지막 요소 (지수)로 매핑합니다.

    • -최대 요소를 가져옵니다.



1

옥타브 : 30 바이트

@(x)max(histc(a=factor(x),a));
  1. a=factor(x)의 소수를 포함하는 벡터를 반환합니다 x. 이 모든 수의 곱셈 오름차순으로 정렬 벡터이다 factor(x)수익률이 x벡터의 각 숫자가 소수 등 그 자체있다.
  2. histc(...,a)빈이 주요 요인 인 주요 요인 벡터에 대한 히스토그램을 계산합니다. 히스토그램은 각 소수를 본 횟수를 세어 각 소수의 지수를 산출합니다. factor(x)중복 된 숫자 나 빈을 반환 하더라도 빈 중 하나만 소수를 볼 수있는 총 횟수를 캡처 하므로 여기에서 약간의 부정 행위를 할 수 있습니다.
  3. max(...) 따라서 가장 큰 지수를 반환합니다.

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


1

Alice , 17 바이트

/o
\i@/w].D:.t$Kq

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

설명

/o
\i@/...

이것은 십진 I / O를 가진 단순한 산술 프로그램을위한 프레임 워크 일뿐입니다. 이 ...이미 스택에 입력을 갖고 스택의 상단에 출력을 떠나는 실제 프로그램이다.

Alice는 실제로 정수의 소수 분해를 얻기 위해 기본 제공 기능을 갖추고 있지만 소수를 사용하여 생성 한 가장 짧은 것은 이보다 10 바이트 더 깁니다.

대신 아이디어는 우리가 1에 도달 할 때까지 입력에서 각각의 고유 한 소인수의 사본 하나를 반복해서 나누는 것 입니다. 이것이 걸리는 단계의 수는 가장 큰 소수 지수와 같습니다. 테이프 헤드를 카운터 변수로 남용 할 것입니다.

w      Remember the current IP position. Effectively starts a loop.
  ]      Move the tape head to the right, which increments our counter.
  .D     Duplicate the current value, and deduplicate its prime factors.
         That means, we'll get a number which is the product of the value's
         unique prime factors. For example 144 = 2^4 * 3^2 would become
         6 = 2 * 3.
  :      Divide the value by its deduplicated version, which decrements the
         exponents of its prime factors.
  .t     Duplicate the result and decrement it. This value becomes 0 once we
         reach a result of 1, which is when we want to terminate the loop.
$K     Jump back to the beginning of the loop if the previous value wasn't 0.
q      Retrieve the tape head's position, i.e. the number of steps we've taken
       through the above loop.

1

줄리아, 60 52 40 바이트

f(x)=maximum(collect(values(factor(x))))

Steadybox 덕분에 -12 + 수정


1
에 전화를 추가해야한다고 생각합니다 print(). 또한 코드를 그대로 TIO 에서 실행할 수 없었습니다. 다른 언어 버전에서는 작동하지 않는다고 가정합니까? 이것은 TIO에서 잘 작동합니다 : print(maximum(collect(values(factor(parse(BigInt,readline()))))))
Steadybox

이것은 인터프리터 (적어도 내 컴퓨터에서는)에서 작동합니다. 또한 BigInt를 초기화하는 것이 더 이상 사용되지 않으므로 경고가 발생합니다. 그럼에도 불구하고 코드를 그대로 복사하여 Julia 인터프리터에 붙여 넣으면 작동합니다. (명시 적으로 인쇄해야하므로 인쇄가 필요한 경우)
EricShermanCS

1
print()응답이 전체 프로그램을 할 필요가 있기 때문에 필요하다 (즉, 디스플레이 출력) 또는 함수 (즉, 반환 출력). 그렇지 않으면 솔루션이 좋습니다. 다음과 같은 방법으로 일부 바이트를 절약하고 인쇄를 피할 수 있습니다.f(x)=maximum(collect(values(factor(x))))
Steadybox

1
천만에요! 다음 은 솔루션에 허용되는 형식에 대한 메타 게시물입니다.
Steadybox

0

실제로 4 바이트

w♂NM

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

w♂NM-전체 프로그램.

w-소인수 분해를 [prime, exponent] 쌍으로 푸시합니다.
 ♂N-각각의 마지막 요소 (지수)를 구합니다.
   M-최대

테스트 사례를 작성하기 위해이 정확한 솔루션을 사용했습니다. :)
Mego

@ 메고 더 짧아 질 수 있다고 생각하십니까? :)
Mr. Xcoder

아니요, 이것이 실제로 최적이라고 생각합니다.
Mego

0

파이썬 2 , 64 바이트

H.PWiz 덕분에 -4 바이트

lambda n:max(a*(n%k**a<1)for a in range(n)for k in range(2,-~n))

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

포트 H.PWiz는 하스켈 대답 . 나는이 Haskell 코드를 이해하고 번역 할 수 있다는 것을 자랑스럽게 생각하기 때문에 이것을 공유하고 있습니다. :피


않습니다 range(1,n)작동하지?
H.PWiz

range(1, n)[1, n)의 모든 정수를 생성합니다.
완전히 인간적인

1
아, 글쎄, 당신은 실제로 n까지 올라갈 필요가 없습니다a
H.PWiz

오, 알았어, 나는 그 배후의 수학을 완전히 이해하지 못한다. : P 감사합니다!
완전히 인간적인


0

공리, 61 바이트

f n==(a:=factors n;reduce(max,[a.i.exponent for i in 1..#a]))

() 괄호를 사용하지 않고 함수를 정의하는 것이 가능하다는 것을 처음 발견했습니다. "f (n) ==" "fn =="한 문자 이하 ...


0

라켓 , 83 79 바이트

(λ(n)(cadr(argmax cadr((let()(local-require math/number-theory)factorize)n))))

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

(나는 완전한 라켓 솔루션을 구성하는 것에 대한 합의가 있는지 확실하지 않으므로 순수한 함수가 계산하는 Mathematica 규칙을 사용합니다.)

작동 원리

factorize쌍의 목록으로 인수 분해를 (factorize 108)제공합니다 '((2 2) (3 3)). gives . 쌍의 두 번째 요소는 (목록의 머리글)과 (목록의 꼬리 ) cadr의 구성에 대한 약어입니다 .carcdr

나는 (cadr (argmax cadr list))두 번째 요소의 최대 값을 찾으려고 바보처럼 생각 하지만 max목록에서 작동 (max (map cadr list))하지 않습니다. 우리가 원하는 것을하지 않습니다. 나는 라켓의 전문가가 아니므로 이것을 수행하는 더 좋은 표준 방법이있을 수 있습니다.

라켓, 93 바이트

(λ(n)(define(p d m)(if(=(gcd m d)d)(+(p d(/ m d))1)0))(p(argmax(λ(d)(p d n))(range 2 n))n))

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

작동 원리

가져 오지 않고 factorize대신 처음부터 모든 것을 수행하는 대체 버전입니다 . 이 함수 (p m d)d그 나누기 의 가장 큰 거듭 제곱을 찾은 m다음 and 사이 에 (p n d)대한 가장 높은 값을 찾습니다 . (이것은 소수로 제한 할 필요가 없습니다. 왜냐하면 소수보다 더 나은 복합 파워는 없기 때문입니다.)d2n


표준 max솔루션은 (apply max (map cadr list)좋지만 (cadr (argmax cadr list))불행히도 짧습니다.
Misha Lavrov


0

APL (NARS), 15 자, 30 바이트

{⌈/+/¨v∘=¨v←π⍵}

테스트:

  f←{⌈/+/¨v∘=¨v←π⍵}
  f¨2..12
1 1 2 1 1 1 3 2 1 1 2 
  f¨144 200 500 1024 3257832488
4 3 3 10 3 

논평:

{⌈/+/¨v∘=¨v←π⍵}
          v←π⍵    π12 return 2 2 3; assign to v the array of prime divisors of argument ⍵
      v∘=¨        for each element of v, build one binary array, show with 1 where are in v array, else puts 0 
                  return one big array I call B, where each element is the binary array above
   +/¨            sum each binary element array of  B
 ⌈/               get the max of all element of B (that should be the max exponet)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.