Sederhanakan akar kuadrat

29

Dengan bilangan bulat positif n, sederhanakan akar kuadrat √nke dalam formulir a√bdengan mengekstraksi semua faktor kuadrat. Outputted a,bharus bilangan bulat positif dengan n = a^2 * bdengan bsekecil mungkin.

Anda dapat menampilkan adan bdalam urutan apa pun dalam format apa pun yang wajar. Anda tidak boleh mengabaikan output 1sebagai implisit.

Output untuk n=1..36sebagai (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)

Ini adalah OEIS A000188 dan A007913 .

Terkait: Versi yang lebih kompleks .

Tidak
sumber
Kami pernah mengalami ini sebelumnya , dan itu ditutup sebagai duplikat dari tantangan yang terkait di sini.
flawr

Jawaban:

13

Jelly , 9 byte

ÆE;0d2ZÆẸ

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Æ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.
Dennis
sumber
3
Di UTF-8, ya, tapi Jelly menggunakan halaman kode khusus. The byte link dalam poin sundulan untuk itu.
Dennis
Anda banyak memposting komentar itu, jadi mungkin Anda harus membuat byte seperti lebih jelas (misalnya:[bytes](link-to-byes) (not UTF-8)
NoOneIsHere
12

PARI / GP, 12 byte

n->core(n,1)

coremengembalikan bagian squarefree dari nsecara default, tetapi pengaturan flag argumen kedua ke 1 membuatnya mengembalikan kedua bagian. Urutan output adalah (b, a), mis (n->core(n,1))(12) -> [3, 2].

Sp3000
sumber
11

Python 2, 43 byte

k=n=input()
while n%k**2:k-=1
print k,n/k/k

Uji di Ideone .

Dennis
sumber
6

MATL , 12 byte

t:U\~f0)GyU/

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
2

Mathematica 34 byte

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

Ini mengatakan untuk mengganti semua input ( #) sesuai dengan aturan berikut: (1) angka, a , kali akar kuadrat dari b harus diganti oleh {a, b} dan fungsi b untuk kekuatan apa pun yang harus diganti oleh {1, b }. Perhatikan bahwa fungsi tersebut mengasumsikan bahwa input akan berupa Sqrt[n],. Ini tidak akan bekerja dengan input lainnya.

Fungsi yang tidak disebutkan namanya ini luar biasa samar untuk Mathematica. Hal ini dapat diklarifikasi dengan menunjukkan bentuknya yang lengkap, diikuti dengan penggantian dari bentuk yang lebih pendek.

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]]]]]

yang sama dengan

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

dan

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

dan

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

dan

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

dan

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

Matlab, 51 byte

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

Penjelasan

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
pajonk
sumber
1

JavaScript (ECMAScript 2016), 40 byte

n=>{for(k=n;n%k**2;k--);return[k,n/k/k]}

Pada dasarnya port JavaScript jawaban Dennis's Python 2 .

Cobalah di JSBin .

Catatan: tidak berfungsi dalam mode ketat, karena ktidak diinisialisasi di mana pun. Untuk membuatnya bekerja dalam mode ketat, k=ndalam loop harus diubah menjadi let k=n.

Michał Perłakowski
sumber
1

Haskell, 43> 42 byte

Solusi brute force.

Disimpan 1 byte berkat Xnor

f n=[(x,y)|y<-[1..],x<-[1..n],x*x*y==n]!!0
Damien
sumber
Solusi yang bagus, saya suka bagaimana itu tidak menggunakan modatau div. Saya pikir Anda bisa melakukannya y<-[1..]karena malas.
xnor
Ya kamu benar. Itu tidak mungkin dengan solusi pertama saya last[(x,y)|x<-[1..n],y<-[1..n],x*x*y==n]tetapi sekarang akan berhasil. Terima kasih. Apakah Anda punya solusi sendiri di Haskell?
Damien
1

05AB1E, 14 byte

Lv¹ynÖi¹yn/y‚ï

Dijelaskan

Lv              # for each x in range(1,N) inclusive
  ¹ynÖi         # if N % x^2 == 0
       ¹yn/y‚ï  # create [N/x^2,x] pairs, N=12 -> [12,1] [3,2]
                # implicitly output last found pair

Cobalah online

Emigna
sumber
1

Python, 74 Bytes

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

Cukup mudah.

Backerupper
sumber
0

Python 2.7 (ungolfed) - 181 Bytes

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

Jalankan sebagai: e (angka) misalnya. e (24)

Output sampel:

>> 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)
Swadhikar C
sumber
1
Tolong
usahakan
0

APL, 25 karakter

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

Dalam Bahasa Inggris:

  • 0⍳⍨⌽⍵|⍨×⍨⍳⍵: indeks kotak terbesar hingga n yang membelah sepenuhnya n;
  • 1+⍵-: indeks dalam array terbalik, jadi sesuaikan indeks
  • (⊢,⍵÷×⍨): menghasilkan hasil: indeks itu sendiri (a) dan hasil bagi b (yaitu, n ÷ a * a)

Uji:

     ↑{(⊢,⍵÷×⍨)⊃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
lstefano
sumber
0

JavaScript (ECMAScript 6), 35 byte

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

JavaScript 1+, 37 B

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