Harmonik serilerin paydası


16

Daha önce, yaptığımız pseudofactorial gelen sayıların LCM olan, bir dizi 1için n.

Kesirleri birlikte eklemek yararlı olacaktır.

Ancak, biz payda bulmak 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6olduğunu 20yerine pseudofactorial ait 6olduğunu 60.

Senin görevin 1/1 + 1/2 + ... + 1/nverilen pozitif tamsayının paydasını bulmak n.

testcases

 n result
 1 1
 2 2
 3 6
 4 12
 5 60
 6 20
 7 140
 8 280
 9 2520
10 2520
11 27720
12 27720
13 360360
14 360360
15 360360
16 720720
17 12252240
18 4084080
19 77597520
20 15519504
21 5173168
22 5173168
23 118982864
24 356948592
25 8923714800
26 8923714800
27 80313433200
28 80313433200
29 2329089562800
30 2329089562800

Referanslar

Liderler Sıralaması


Ne kadar girdi için çalışması gerekiyor?
Brad Gilbert b2gills

@ BradGilbertb2gills Makul olduğu kadar büyük.
Leaky Nun

Yanıtlar:


8

M , 9 6 bayt

3 bayt tasarruf için FryAmTheEggman'a teşekkürler ! Kod:

RİSg¹İ

M'nin burada büyük bir avantajı var, çünkü şamandıralar yerine kesirler ile çalışıyor. Açıklama:

R       # Get the list [1 ... n].
 İ      # Inverse each, resulting into [1/1, 1/2, 1/3, ..., 1/n].
  S     # Sum it up. (86021/27720 for n=12)
   g¹   # Compute the greatest common denominator with n. (1/27720 for n=12)
     İ  # Calculate the inverse again. (27720 for n=12)

Jelly kodlamasını kullanır . Çevrimiçi deneyin! .


Ayrıca, bazen önde gelen bir sıfır (örneğin ) veren 4 baytlık bir çözüm vardır 280 -> 0280. Buna izin verilip verilmediğinden emin değilim:

RİSV

Çevrimiçi deneyin! .


1
1. 6 baytlık kodun açıklaması doğru değil. fraksiyonun en yaygın ortak bölenini hesaplar ve n . Kullanmak g1muhtemelen daha net olurdu. 2. Vfraksiyonu bir ipe döker ve niladik olarak değerlendirir. <num>/bir niladik operatör tarafından (kümülatif olmayan) bir azalmadır. Bu saçmalıktır, ancak yalnızca bir sayı (örtük argüman 0 ) olduğundan, hiçbir şey yapmaz. Bir sonraki bağlantı, payda niladiktir, bu nedenle önceki dönüş değeri örtük olarak yazdırılır ve yerine bu nilad yerleştirilir.
Dennis

@Dennis Teşekkürler! Açıklama düzeltildi.
Adnan

@Adnan M için herhangi bir belge var mı?
Esolanging Fruit

@ Challenger5 Bildiğimden değil. Aslında Jelly'in bir çeşididir, ancak keyfi kesirlerle. Jelly belgeleri kullanılabilir, ancak Jelly'de uygulanan birçok özelliğin M'de uygulanmadığına dikkat edin.
Adnan

5

Julia, 22 bayt

Anonim bir işlev.

n->1.//(1:n)|>sum|>den

Aynı uzunluk:n->sum(inv,1//1:n).den
Alex A.

4

Mathematica, 27 bayt

Anonim bir işlev.

Denominator@*HarmonicNumber

Örneğin:

 In[1] := (Denominator@*HarmonicNumber)[10]
 Out[1] = 2520

Sohbete girerseniz 26 baytlık bir çözüm bulabilirsiniz :)
Leaky Nun

Ah! Martin'in bunu sevmesine izin vermeliyim. Bu oldukça değişmez, bu yüzden saklayacağım.
Lynn

Kodun nasıl kullanıldığını örnekler misiniz?
DavidC

3

Python 2, 69 67 bayt

a=b=k=r=1
exec'a=a*k+b;b*=k;k+=1;'*input()
while r*a%b:r+=1
print r

Ideone üzerinde test edin .

Nasıl çalışır

Let , H, (n) birinci çarpan tersleri toplamı , n pozitif tam. Her zaman, a / b = 1 + H (k - 1) var . Aslında, bir , b ve k her başlatılır 1 ve 1/1 = 1 = 1 + H (0) .

Kod snippet'ini tekrarlıyoruz

a=a*k+b;b*=k;k+=1;

(dize olarak) n (giriş) kez girin ve sonucu yürütün. Her adımda a / b + 1 / k = ak / bk + b / bk = (ak + b) / bk kimliğini kullanarak a , b ve k'yi güncelleriz .

Tüm kopyalar yürütüldükten sonra, H (n) ile aynı paydaya sahip olan a / b = 1 + H (n) .

Tamamen indirgenmiş bir şekilde a / b olup , (a ÷ gcd (a, b)) / (b ÷ gcd (a, b)) . En büyük ortak böleni hesaplamak yerine, r'yi 1 olarak başlatırız ve ra , b'nin katları olana kadar r'yi artırmaya devam ederiz .

Açıkçası bu, ra'yı a ve b'nin en az ortak katı yapar . Yana gcd (a, b) · sm (a, b) = ab , o sahip b ÷ gcd (a, b) = sm (a, b) ÷ a = ra ÷ a = r , yapım r istenen çıkış.


3

Haskell, 52

Import Data.Ratio
f n=denominator$sum[1%k|k<-[1..n]]

Dosya GHCI'ye yüklenirse, f işlev olarak kullanılabilir.


1
Muhtemelen importküçük harf mi demek istediniz ? mapAnlama yerine kullanmak için bir bayt kaydeder :sum$map(1%)[1..n]
xnor

2

Jöle, 9 bayt

!©÷RSg®®÷

Burada deneyin.

             Argument: n
! ÷R         Compute [n!÷1, n!÷2, … n!÷n].
 ©             (And store n! in the register.)
    S        Find the sum of this list.
     g®      GCD with n!.
       ®÷    Divide n! by this GCD.

Bu kayıt olmadan aynı bayt sayısına ulaşmanın mümkün olduğuna inanıyorum.
Leaky Nun

2

MATL , 14 13 bayt

:p:G:!/s1\&X<

Çevrimiçi deneyin!

açıklama

Giriş için N çıkış ile üst sınırlanmaktadır N ! ( N faktöriyeli ). Kod n = 1, ..., N için n / k değerini hesaplar ! ve k = l, ..., N için . Daha sonra harmonik sayıyı her n ile çarparak k'yi toplar . İstenen sonuç , bir tamsayı olan bu değerlerden ilkinin n indeksidir .


2

Yakut, 57 47 bayt

->n{(1..n).reduce{|a,i|a+1.to_r/i}.denominator}

Kevin Lau'a bunu on bayt kısalttığı için teşekkürler .


Bir değişken atayın, 1.to_rböylece dize enjeksiyonu ve dönüşümü yapmanız gerekmez. Ayrıca, Ruby'nin varsayılanı reduceilk öğeyi başlangıç ​​olarak kullanmak olduğundan ve 1/1=1özellikle 0başlangıç ​​değeri olarak ayarlamanıza gerek yoktur .
Değer Mürekkebi

2

Mathematica, 26 bayt

Denominator@Tr[1/Range@#]&

Ad nolarak alınan ve paydayı döndüren isimsiz bir fonksiyon . TrKarşılıklılıkların listesini toplamak için standart kötüye kullanım (izleme) yöntemini kullanır .


1

JavaScript (ES6), 88 bayt

m=>{for(d=1,i=0;i<m;d*=++i);for(n=i=0;i<m;n+=d/++i);for(g=d;g;[g,n]=[n%g,g]);return d/n}

JavaScript'in sayısal hassasiyetinin sınırları nedeniyle yalnızca m = 20'ye kadar çalışır.


1

05AB1E , 8 bayt

Kod:

!йL/O¿/

Açıklama:

!         # Take the factorial of the input.
 Ð        # Triplicate this.
  ¹L      # Get the list [1 ... input].
    /O    # Divide and sum up.
      ¿   # Get the GCD of the sum and the factorial.
       /  # Divide the factorial by this.

Python'un bölünmesi nedeniyle n> 19 için bazı doğruluk sorunları olabilir ... CP-1252'yi kullanır kodlamasını .

Çevrimiçi deneyin! .



0

J, 20 bayt

(!%!+.[:+/!%1+i.)@x:

@ Lynn'in çözümü tarafından kullanılan yaklaşıma dayanarak .

Büyük n değerleri için hassasiyet gerekli değilse veya n'nin ekli bir genişletilmiş tamsayı olarak geçeceğini varsayabilirsek x, 15 bayt için daha kısa bir çözüm kullanılabilir .

!%!+.[:+/!%1+i.

kullanım

   f =: (!%!+.[:+/!%1+i.)@x:
   f 30
2329089562800
   (,:f"0) >: i. 15
1 2 3  4  5  6   7   8    9   10    11    12     13     14     15
1 2 6 12 60 20 140 280 2520 2520 27720 27720 360360 360360 360360

açıklama

(!%!+.[:+/!%1+i.)@x:  Input: n
                  x:  Convert n into an extended integer
              i.      Creates the range [0, 1, ..., n-1]
            1+        Add one to each, range is now [1, 2, ..., n]
          !           Get factorial of n
           %          Divide n! by each value in the range [1, 2, ..., n]
      [:+/            Sum those values
   !                  Get n!
    +.                Get gcd between n! and the sum
 !                    Get n!
  %                   Divide n! by the gcd and return

0

Perl 6 ,  36  32 bayt

{([+] 1.FatRat X/1..$_).denominator}
{([+] 1.FatRat X/1..$_).nude[1]}

Açıklama:

{
  (
    [+]        # reduce with &infix:<+>

      # the following produces a Seq of Rational numbers
      # 1/1, 1/2, 1/3 ... 1/n

      1.FatRat # FatRat.new: 1,1
      X/       # crossed using &infix:</>
      1 .. $_  # Range from 1 to the input inclusive

  ) # resulting in a FatRat

  .nude # (nu)merator (de)nominator
  .[1]  # grab the denominator
}

Ölçek:

my &hd = {([+] 1.FatRat X/1..$_).nude[1]}

say (1..10)».&hd; # (1 2 6 12 60 20 140 280 2520 2520)

say hd 100; # 2788815009188499086581352357412492142272
say chars hd 1000; # 433
say chars hd 10000; # 4345

0

Hoon , 95 bayt

|=
@
=+
n=(gulf 1 +<)
=+
f=(roll n mul)
(div f d:(egcd f (roll (turn n |=(@ (div f +<))) add)))

Liste oluşturun , faktöriyel için [1...n]katlayın ++mul, liste oluşturun [n!/1, n!/2, ... n!/n]ve toplayın, GCD'yi n!ve listeyi bulun ve faktöriyeti bu numaraya bölün.

Paydayı hesaplamanın muhtemelen çok daha kolay bir yolu var, ama anlayamıyorum: /


Oh Hoon, tokenizörünüzün neden bu kadar çok beyaz alana ihtiyacı var?
Sızdıran Rahibe

Tüm Hoon girişlerim yeni satırlar nedeniyle çirkin görünüyor :( Normal Hoon kodu jetonlar arasında iki boşluk kullanıyor, ancak bir satırsonu daha kısa
RenderSettings

0

Python 3, 15315014214214 bayt

Eminim bu daha fazla golf olabilir. Ama ben burada yeniyim

f=lambda x:0**x or x*f(x-1)
z=int(input());i=f(z)
r=sum(i/y for y in range(1,z+1))  
p=lambda a,b:a if b<1else not a%b+b or p(b,a%b)
print(i/p(r,i))

PPCG'ye Hoşgeldiniz!
Leaky Nun

0

Aksiyom, 34 bayt

f(x)==denominator(sum(1/n,n=1..x))

Ölçek

(24) -> [[i,f(i)] for i in 1..30]
   (24)
   [[1,1], [2,2], [3,6], [4,12], [5,60], [6,20], [7,140], [8,280], [9,2520],
    [10,2520], [11,27720], [12,27720], [13,360360], [14,360360], [15,360360],
    [16,720720], [17,12252240], [18,4084080], [19,77597520], [20,15519504],
    [21,5173168], [22,5173168], [23,118982864], [24,356948592],
    [25,8923714800], [26,8923714800], [27,80313433200], [28,80313433200],
    [29,2329089562800], [30,2329089562800]]
                                       Type: List List Expression Integer

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.