간단히하시오 square root


29

양의 정수가 주어지면 모든 제곱 인수를 추출 하여 n제곱근 √n을 형태로 단순화하십시오 a√b. 출력 된 a,b긍정적 인 정수이어야 n = a^2 * b으로 b가능한 한 작게.

당신은 출력 할 수있다 ab합리적인 형식 중 하나를 위해. 1암시 적으로 출력을 생략 할 수 없습니다 .

의 출력은 다음 n=1..36(a,b)같습니다.

1 (1, 1)
2 (1, 2)
3 (1, 3)
4 (2, 1)
5 (1, 5)
6 (1, 6)
7 (1, 7)
8 (2, 2)
9 (3, 1)
10 (1, 10)
11 (1, 11)
12 (2, 3)
13 (1, 13)
14 (1, 14)
15 (1, 15)
16 (4, 1)
17 (1, 17)
18 (3, 2)
19 (1, 19)
20 (2, 5)
21 (1, 21)
22 (1, 22)
23 (1, 23)
24 (2, 6)
25 (5, 1)
26 (1, 26)
27 (3, 3)
28 (2, 7)
29 (1, 29)
30 (1, 30)
31 (1, 31)
32 (4, 2)
33 (1, 33)
34 (1, 34)
35 (1, 35)
36 (6, 1)

이들은 OEIS A000188A007913 입니다.

관련 : 더 복잡한 버전 .


우리는 전에 이것을 가지고 있었고 , 그것은 여기에 연결된 도전의 복제본으로 닫혔습니다.
flawr

답변:


13

젤리 , 9 바이트

ÆE;0d2ZÆẸ

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

ÆE;0d2ZÆẸ  Main link. Argument: n

ÆE         Exponents; generate the exponents of n's prime factorization.
  ;0       Append 0 since 1ÆE returns [].
    d2     Divmod by 2.
      Z    Zip/transpose to group quotients and remainders.
       ÆẸ  Unexponent; turn the exponents of prime factorizations into integers.

3
UTF-8에서는 그렇지만 Jelly는 사용자 정의 코드 페이지를 사용합니다. 헤더 의 바이트 링크가이를 가리 킵니다.
Dennis

이 주석을 많이 게시하므로 바이트를 더 명확하게 만들어야합니다 (예 : [bytes](link-to-byes) (not UTF-8).
NoOneIsHere

12

PARI / GP, 12 바이트

n->core(n,1)

coren기본적으로 squarefree 부분을 반환 하지만 두 번째 인수 플래그를 1로 설정하면 두 부분을 모두 반환합니다. 출력 순서는 (b, a)예를 들어 (n->core(n,1))(12) -> [3, 2]입니다.



6

MATL , 12 바이트

t:U\~f0)GyU/

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

설명

t     % Take input n implicitly. Duplicate
:U    % Push [1 4 9 ... n^2]
\~    % True for entries that divide the input
f0)   % Get (1-based) index of the last (i.e. largest) dividing number
G     % Push input again
y     % Duplicate index of largest dividing number
U     % Square to recover largest dividing number
/     % Divide input by that. Implicitly display stack


2

Mathematica 34 바이트

#/.{a_ b_^_:>{a, b},_[b_,_]:>{1,b}}&

이것은 #다음 규칙에 따라 모든 입력 ( ) 을 대체한다고 말합니다 . (1) b의 제곱근을 대체해야하는 숫자, a , {1, b로 대체되어야하는 것의 거듭 제곱으로 함수 b }. 이 함수는 입력이 형식 인 것으로 가정합니다 . 다른 종류의 입력에서는 작동하지 않습니다.{a, b}Sqrt[n]

이 명명되지 않은 함수는 Mathematica에서 비정상적으로 암호입니다. 전체 형식을 표시 한 다음 원래의 짧은 형식을 교체하여 다소 명확하게 설명 할 수 있습니다.

Function[
   ReplaceAll[
      Slot[1],
      List[
         RuleDelayed[Times[Pattern[a,Blank[]],Power[Pattern[b,Blank[]],Blank[]]],List[a,b]],
         RuleDelayed[Blank[][Pattern[b,Blank[]],Blank[]],List[1,b]]]]]

이것은 같은

   ReplaceAll[
      #,
      List[
         RuleDelayed[Times[Pattern[a,Blank[]],Power[Pattern[b,Blank[]],Blank[]]],List[a,b]],
         RuleDelayed[Blank[][Pattern[b,Blank[]],Blank[]],List[1,b]]]]&

ReplaceAll[#, 
  List[RuleDelayed[
    Times[Pattern[a, Blank[]], 
     Power[Pattern[b, Blank[]], Blank[]]], {a, b}], 
   RuleDelayed[Blank[][Pattern[b, Blank[]], Blank[]], {1, b}]]] &

ReplaceAll[#, 
  List[RuleDelayed[Times[a_, Power[b_, _]], {a, b}], 
   RuleDelayed[Blank[][b_, _], {1, b}]]] &

ReplaceAll[#, {RuleDelayed[a_*b^_, {a, b}], RuleDelayed[_[b_, _], {1, b}]}]&

ReplaceAll[#, {a_*b^_ :> {a, b}, _[b_, _] :> {1, b}}] &


1

Matlab, 51 바이트

x=input('');y=1:x;z=y(~rem(x,y.^2));a=z(end)
x/a^2

설명

x=input('')       -- takes input
y=1:x             -- numbers from 1 to x
z=y(~rem(x,y.^2)) -- numbers such that their squares divide x
a=z(end)          -- biggest such number (first part of output)
x/a^2             -- remaining part


1

하스켈, 43> 42 바이트

무차별 대입 솔루션.

Xnor 덕분에 1 바이트 절약

f n=[(x,y)|y<-[1..],x<-[1..n],x*x*y==n]!!0

니스 솔루션, 나는 그것을 사용하지 않는 방법을 좋아한다 moddiv. y<-[1..]게으름 때문에 할 수 있다고 생각합니다 .
xnor

그래 네가 맞아. 첫 번째 솔루션으로는 불가능 last[(x,y)|x<-[1..n],y<-[1..n],x*x*y==n]했지만 이제는 작동합니다. 감사. Haskell에 고유 한 솔루션이 있습니까?
Damien


1

파이썬, 74 바이트

def e(k):a=filter(lambda x:k/x**2*x*x==k,range(k,0,-1))[0];return a,k/a**2

충분히 간단합니다.


0

Python 2.7 (ungolfed)-181 바이트

def e(n):   
 for x in range(1,n+1):
  r=(1,x)
  for i in range(1,x+1):
   l=i**.5
   for j in range(1,x+1): 
    if i*j==x and l%1==0 and j<r[1]:r=(int(l),j)                
  print x,r

e (숫자) 예 : e (24)

샘플 출력 :

>> e(24)
1 (1, 1)
2 (1, 2)
3 (1, 3)
4 (2, 1)
5 (1, 5)
6 (1, 6)
7 (1, 7)
8 (2, 2)
9 (3, 1)
10 (1, 10)
11 (1, 11)
12 (2, 3)
13 (1, 13)
14 (1, 14)
15 (1, 15)
16 (4, 1)
17 (1, 17)
18 (3, 2)
19 (1, 19)
20 (2, 5)
21 (1, 21)
22 (1, 22)
23 (1, 23)
24 (2, 6)

1
골프에 가능한 한만큼 답변을 시도하십시오, 이것은이다 코드 골프
케어 드 coinheringaahing

0

APL, 25 자

 {(⊢,⍵÷×⍨)1+⍵-0⍳⍨⌽⍵|⍨×⍨⍳⍵}

영어로:

  • 0⍳⍨⌽⍵|⍨×⍨⍳⍵: n을 완전히 나누는 n의 최대 제곱의 지수;
  • 1+⍵-: 색인이 역 배열에 있으므로 색인을 조정하십시오.
  • (⊢,⍵÷×⍨): 결과를 산출합니다 : 인덱스 자체 (a) 및 몫 b (즉, n ÷ a * a)

테스트:

     ↑{(⊢,⍵÷×⍨)⊃z/⍨0=⍵|⍨×⍨z←⌽⍳⍵}¨⍳36
1  1
1  2
1  3
2  1
1  5
1  6
1  7
2  2
3  1
1 10
1 11
2  3
1 13
1 14
1 15
4  1
1 17
3  2
1 19
2  5
1 21
1 22
1 23
2  6
5  1
1 26
3  3
2  7
1 29
1 30
1 31
4  2
1 33
1 34
1 35
6  1

0

자바 스크립트 (ECMAScript 6), 35 바이트

f=(n,k=n)=>n/k%k?f(n,--k):[k,n/k/k]

자바 스크립트 1+, 37 B

for(k=n=prompt();n/k%k;--k);[k,n/k/k]

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