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 .


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.

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


11

Python 2, 43 byte

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

Uji di Ideone .


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


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


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

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.


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

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


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.


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)

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

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]

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.