Asal faktöriyellerin oranı olarak rasyonel sayılar yazma


19

Not: Bu sorun korumalı alana gönderildi .

Giriş

Bu zorluk, lisans matematik yarışmasında bir sorun olan 2009 Putnam B1'den esinlenmiştir . Sorun şu şekildedir:

Her pozitif rasyonel sayının (mutlaka farklı değil) primerlerin faktöriyellerinin bir bölümü olarak yazılabileceğini gösterin. Örneğin,

$ \ frac {10} 9 = \ frac {2! \ cdot 5!} {3! \ cdot 3! \ cdot 3!}. $

Meydan okuma

Zorluğunuz, girdi olarak pozitif rasyonel sayının (veya sadece rasyonel sayının kendisinin) payını ve paydasını temsil eden ve asal sayıların iki listesini (veya dizilerini, vb.) girilen rasyonel sayı, birinci listedeki primer faktörlerin çarpımının ürününün ikinci listedeki primerlerin faktörlerin çarpımına oranına eşittir.

notlar

  • Hem ilk listede hem de ikinci listede yer alan hiçbir asal olmayabilir; bununla birlikte, her iki listede de bir asal dilekçe görülebiliyor.
  • Girişlerin her birinin 1 ve 65535 arasında (kesin olmayan) olduğu varsayılabilir; ancak, çıkmanız gereken sayıların faktöriyellerinin bu aralıkta olacağı varsayılamaz.

Örnek Giriş ve Çıkış

İşte yasal girdi ve çıktı örnekleri.

input=>output
10,9 => [2,5],[3,3,3]
2,1 => [2],[]
3,1 => [3],[2]
1,5 => [2,3,2],[5]     (elements of a list may be in any order)
3,2 => [3],[2,2]
6,1 => [3],[]

(2,2), (0,3), (3,0), (3,6) ve (1,65536) girişleri yasadışı girişlerdir (yani, programınızın herhangi bir şekilde davranması gerekmez) ). Yasadışı çıktılara bazı örnekler:

1,2 => [2],[2,2] (2 is in both returned lists)
5,2 => [5],[2,4] (4 is not prime)
2,1 => [2],[1] (1 is not prime either)
3,2 => [3],[2] (3!/2! = 3, not 3/2)

puanlama

Bu , bu yüzden bayt en düşük puan kazanır!


Cevabı ifade etmenin birden fazla yolu olması durumunda, asgari düzeyde azaltılmış rasyonel bir çeşit verilmesi gerekiyor mu? Örneğin 10/9= [2*5]/[3*3]= [(2!/1!) * (5!/4!)] / [(3!/2!) * (3!/2!)]= [2! * 5! * 2! * 2!] / [3! * 3! * 1! * 4!]= (2! * 2! * 2! *5!) / (3! * 3! * 4!).
Dijital Travma

@DigitalTrauma No; ancak, 4 asal değildir, bu yüzden ikincisi geçerli olmaz. Herhangi bir temsilin benzersiz olduğuna inanıyorum (ve isterseniz soruya bir kanıt yazabilirim).
Carl Schildkraut

O kesir olarak girdi almak iyi mi 10/9ziyade sayı çifti 10ve 9?
Misha Lavrov

@MishaLavrov Tabii. Soruyu bunu yansıtacak şekilde düzenleyeceğim.
Carl Schildkraut

@CarlSchildkraut Teşekkürler - evet bu yardımcı olur - Ben bir şey eksik olduğunu düşündüm
Digital Trauma

Yanıtlar:


5

05AB1E , 54 53 48 46 40 35 33 32 28 bayt

[D¿÷Z#DÓ€gZD<ØŠQ*DˆR!*]¯øεʒĀ

Çevrimiçi deneyin! Düzenleme: Yalnızca @ ASCII sayesinde 2 bayt kaydedildi. Kaydedilen 1 2 3 4 @Emigna sayesinde bayt. (Sadece bir tane daha kaydetmem gerekiyor ve orijinal bayt sayımın yarısına düşüyorum!) Açıklama:

[       Begin an infinite loop
D¿÷     Reduce to lowest terms
Z#      Exit the loop if the (largest) value is 1
DÓ€g    Find the index of the largest prime factor of each value
Z       Take the maximum
D<ØŠ    Convert index back to prime and save for later
Q       Convert to an pair of which value had the largest prime factor
*       Convert to an pair with that prime factor and zero
Dˆ      Save the pair in the global array for later
R!*     Multiply the other input value by the factorial of the prime
]       End of infinite loop
¯ø      Collect all the saved primes
εʒĀ     Forget all the saved 0s

"Duygusal" komut dosyalarını seviyorum -¦D
RedClover



5

Mathematica, 175 177 169 154 108 bayt

Join@@@Table[x[[1]],{s,{1,-1}},{x,r@#},x[[2]]s]&@*(If[#==1,1,{p,e}=Last@(r=FactorInteger)@#;p^e#0[p!^-e#]]&)

Çevrimiçi deneyin!

Nasıl çalışır

Bu iki fonksiyonun bileşimidir. İlk olarak, ungolfs

If[# == 1,
  1,
  {p,e} = Last[FactorInteger[#]];
  p^e * #0[p!^-e * #]
]&

istenen çarpanlara ayırma işleminin gerçekte hesaplanması için özyinelemeli bir fonksiyondur. Özellikle, rasyonel bir girdi göz önüne alındığında x, faktöriyelleri pay ve paydada olması gereken primerleri hesaplıyoruz ve tüm bu primerlerin bir araya gelmesiyle kesri geri veriyoruz. (Örneğin, girişte 10/9 = 2!*5!/(3!*3!*3!)geri dönüyoruz 10/27 = 2*5/(3*3*3).)

Bunu her adımda en büyük asal faktörle başa çıkarak yaparız: x'in çarpanlarına ayırmada p e oluşursa, p! e faktöriyel çarpanlara ayırma işleminde meydana gelir ve x üzerindeki geri çekme p'ye bölünür! e .

(Daha önce, p'den önceki önceki asal sayıya bakarak büyük sayılardan kaçınan daha akıllı bir stratejim vardı, ancak Mathematica 65521 kadar büyük sayıları kolayca işleyebilir, bu yüzden anlamı yok. Tarihte bulabileceğiniz eski sürüm çok daha hızlı: bilgisayarımda, bu sürümün 1.6 saniyede işlediği girişlerde 0.05 saniye sürdü.)

İkinci fonksiyon, birinci fonksiyonun çıkışını primler listesine dönüştürür.

Join @@@ 
  Table[x[[1]],
    {s,{1,-1}},
    {x,FactorInteger[#]},
    x[[2]]*s
  ]&

İçin s=1(pozitif güçler) ve s=-1(negatif güçler) ve her dönem için {prime,exponent}çarpanlara içinde r@#, biz asal sayı tekrarlamak prime exponent*sdefalarca.

109 62 bayt ile rakipsiz sürüm

If[#==1,∇1=1,{p,e}=Last@FactorInteger@#;(∇p)^e#0[p!^-e#]]&

Yukarıdaki ile aynı, ancak liste olarak çıktı vermek yerine, ∇ operatörünü (yerleşik anlamı olmadığı için) faktöriyeller için bir stand olarak kullanarak ifade olarak çıktı verir. Böylece, bir girişi temsil etmek için 10/9bir çıktı verir .(∇2*∇5)/(∇3)^3(2!*5!)/(3!)^3

Bu daha kısadır çünkü işlevin ikinci bölümünü atlarız.


+2 bayt: f=FirstMathematica'nın üzülmesini önlemek için atama doğru yerde yapılmalıdır.

-8 bayt: tamsayı çıktıları için bir hata düzeltildi, bu da kodu kısalttı.

-15 bayt: yararlanabileceğimiz FactorIntegersıralanmış çıktı döndürür.

-46 bayt: zeki olmamız gerekmez.


2

Piton 2, 220 202 195 183 bayt

g=lambda a,b:a and g(b%a,a)or b;n,d=input();m=c=()
while n+d>2:
 t=n*d;f=p=2
 while t>p:
	if t%p:p+=1;f*=p
	else:t/=p
 if n%p:c+=p,;n*=f
 else:m+=p,;d*=f
 t=g(n,d);n/=t;d/=t
print m,c

Çevrimiçi deneyin! Düzenleme: @ Mr.Xcoder sayesinde 18 25 bayt kurtardı. @JonathanFrech sayesinde 12 bayt tasarruf edildi.



Python 2'de daha da kısaltabilirsiniz, çünkü birden çok boşluğu girintideki sekmelerle değiştirebilirsiniz
Bay Xcoder


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.