Tüm pürüzsüz çiftlerini bul


13

Giriş

Sayı teorisinde, asal faktörleri en fazla olduğunda bir sayının -pürüzsüz olduğunu söylüyoruz . Örneğin, 2940 = 7 pürüzsüzdür çünkü .kk2940=223572

Burada bir pürüzsüz çiftini, her ikisi de pürüzsüz olan iki ardışık tamsayı olarak tanımlarız. 7-düzgün çift örneği çünkü ve . Eğlenceli gerçek: Bu aslında en büyük 7 pürüzsüz çift .kk(4374,4375)4374=2374375=547

Størmer 1897'de her için sadece son derece çok sayıda pürüzsüz çiftkk olduğunu kanıtladı ve bu gerçek Størmer Teoremi olarak biliniyor .

Meydan okuma

Göreviniz, asal sayı girişi verildiğinde , tüm -çift çiftlerini çoğaltmadan (çift içindeki sıra önemli değil) çıktısı veren veya döndüren bir program veya işlev yazmaktır.kk

Lütfen , varsayıldığında, ve asal sayıları için , tüm pürüzsüz çiftlerinin de pürüzsüz çiftler olduğunu unutmayın.pqp<qpq

Örnek G / Ç

Input: 2
Output: (1, 2)

Input: 3
Output: (1, 2), (2, 3), (3, 4), (8, 9)

Input: 5
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (8, 9), (9, 10), (15, 16), (24, 25), (80, 81)

Input: 7
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (14, 15),
        (15, 16), (20, 21), (24, 25), (27, 28), (35, 36), (48, 49), (49, 50), (63, 64),
        (80, 81), (125, 126), (224, 225), (2400, 2401), (4374, 4375)

kısıtlama

Program veya fonksiyon teorik olarak tüm girdiler için sınırlı bir sürede sona ermelidir. Standart boşluklara varsayılan olarak izin verilmez.

Kazanma Kriterleri

Bu bir zorluğu olduğundan, her dil için en kısa geçerli başvuru kazanır.


2
2, 3 ve 5 için test senaryoları ekleyebilir misiniz?
Jonathan Allan

@JonathanAllan 2-, 3- ve 5- pürüzsüz çiftler 7 pürüzsüz
çiftte yer alıyor

1
Geçiriyor (1, 2)zorunlu çıkış parçası ..?
Kevin Cruijssen

@KevinCruijssen Evet, tüm çıktılar (1, 2)çifti içermelidir .
Shieru Asakoto

Yanıtlar:


10

JavaScript (ES7),  234  232 bayt

formundaki Pell denklemlerini çözerek çözümleri bulur; burada , düzgün karesız bir sayıdır.x22qy2=1qP

Bu, Derrick Henry Lehmer'ın Størmer'ın orijinal prosedüründen türetilen prosedürünün bir uygulamasıdır .

Anahtarları ve değerleri pürüzsüz çiftlerini tanımlayan bir nesne döndürür .P

P=>[...Array(P**P)].map((_,n)=>(s=(n,i=0,k=2)=>k>P?n<2:n%k?s(n,i,k+1):s(n/k,i,k+i))(n,1)&&(_=>{for(x=1;(y=((++x*x-1)/n)**.5)%1;);(h=(x,y)=>k--&&h(X*x+n*Y*y,X*y+Y*x,x&s(x=~-x/2)&s(x+1)?r[x]=x+1:0))(X=x,Y=y,k=P<5?3:-~P/2)})(),r={})&&r

Çevrimiçi deneyin!

Nasıl?

Yardımcı işlev , belirli bir tamsayısının ile çağrıldığında düz bir sayı olup olmadığını ya da ile çağrıldığında bir kare 1 düz sayı olup olmadığını test eder .snPi=0P i = 1 Pi=1

s = (
  n,
  i = 0,
  k = 2
) =>
  k > P ?
    n < 2
  :
    n % k ?
      s(n, i, k + 1)
    :
      s(n / k, i, k + i)

Hepimiz kare ücretsiz arayın 1 de Pürüzsüz numaraları , nerede bir üst gitmekte olarak kullanılır.P[1..PP1]PPP!

P=>[...Array(P ** P)].map((_, n) => s(n, 1) && (...))

Yukarıda bulunan her sayısı için, Pell denkleminin temel çözümünü arıyoruz :nx2ny2=1

(_ => {
  for(x = 1; (y = ((++x * x - 1) / n) ** .5) % 1;);
  ...
})()

(Yukarıdaki kod olmayan özyinelemeli versiyonudur cevabım için bu diğer meydan )

Temel çözüm bulunduğunda , yineleme ilişkilerini kullanarak çözümleri ile :(x1,y1)(xk,yk)kmax(3,(P+1)/2)

xk+1=x1xk+ny1ykyk+1=x1yk+y1xk

Her biri için biz olmadığını test tek ve hem de ve olan Pürüzsüz. Eğer öyleyse, onları nesnesinde saklarız .xkxk(xk1)/2(xk+1)/2Pr

( h = (x, y) =>
  k-- &&
  h(
    X * x + n * Y * y,
    X * y + Y * x,
    x &
    s(x = ~-x / 2) &
    s(x + 1) ?
      r[x] = x + 1
    :
      0
  )
)(X = x, Y = y, k = P < 5 ? 3 : -~P / 2)

1: bölenler asallık test etmez çünkü işlev aslında ile denir bile, bazı kare olmayan serbest sayılar için truthy olacak . Fikir, çok fazla işe yaramayan Pell denkleminin çözülmemesi için çoğunu filtrelemektir.si=1


Merhaba Arnauld! Kafamı bu ikisinin etrafına dolayamadım : x = ~-x / 2ve -~P / 2bunlar bir çeşit yuvarlanma ...
Rahul Verma

1
@ rv7 ~x, hesaplayan bir bitsel DEĞİLDİR -(x+1). Bu nedenle, ~-xbir -(-x+1)= x-1ve -~xolduğu -(-(x+1))= x+1. JS'deki tüm bitsel işlemler gibi, yalnızca 32 bitlik tamsayı bölümü dikkate alınır. Böylece yuvarlama için kullanılabilirler. Ancak her iki ve zaten tamsayılar burada. PxP
Arnauld

4

Jöle , 16 14 bayt

4*ÆfṀ<ɗƇ‘rƝLÐṂ

Çevrimiçi deneyin!

Daha büyük için verimsiz olan ancak hiçbirinin kaçırılmadığından emin olması gereken kadar çiftleri kontrol eder .4kk

@JonathanAllan'a 1 bayt kaydettiği için teşekkürler!

açıklama

4*ÆfṀ<ɗƇ‘rƝLÐṂ  | Monadic link, input k

4*              | 4**k, call this n
      ɗƇ        | For each number from 1..n filter those where:
  Æf            |   - Prime factors
    Ṁ           |   - Maximum
     <  ‘       |   - Less than k+1
         rƝ     | Inclusive range between neighbouring values
           LÐṂ  | Keep only those of minimum length (i.e. adjacent values)

1
4kk!24k

1
Hızlı cevabınız için teşekkür ederim. Ben de benzer şekilde düşünüyordum, ama daha geniş anlamda: "faktöriyel hızla yükseliyor, muhtemelen yeterince büyük." (ben kareyi almadığım sürece öyle değildi). Daha kısa ve daha verimli golf için tebrikler, benim oyum var.
SparklePony Yoldaş

1
Not ( oeis.org/A002072'den ) "a (n) <10 ^ n / n, n = 4 hariç. (Deneysel verilerden öngörülen.) - MF Hasler, 16 Ocak 2015". Sanırım aksi ispat edemezsek, projecteuclid.org/download/pdf_1/euclid.ijm/1256067456 (teorem 7) içinde Lehmer'in zayıf sınırına bağlı kalmalıyız .
Jonathan Allan

2
... Mathematics SE'de tam olarak bunu soran bir soru var !
Jonathan Allan

1
@PeterTaylor, maksimum sayı için değil, çift sayısı içindir. Sorun, maksimum çift sayısı üzerindeki bir sınırı bilmek, aramayı bırakmanıza izin vermiyor
Nick Kennedy

3

05AB1E , 8 bayt

°Lü‚ʒfà@

Çevrimiçi deneyin!

Açıklama:

°            # 10 ** the input
 Lü‚         # list of pairs up to that number
    ʒ        # filtered by...
     fà      # the greatest prime factor (of either element of the pair)...
       @     # is <= the input

2

Jöle , 123 bayt

¹©Æ½Ø.;µU×_ƭ/;²®_$÷2ị$}ʋ¥⁸;+®Æ½W¤:/$$µƬṪ€F¹;Ḋ$LḂ$?ṭ@ṫ-ṚZæ.ʋ¥ƒØ.,U¤-ịWµ1ịżU×®W¤Ɗ$æ.0ị$ṭµ³’H»3¤¡
ÆRŒPP€ḟ2ḤÇ€ẎḢ€+€Ø-HÆfṀ€<ẠʋƇ‘

Çevrimiçi deneyin!

2×max(3,k+12)x12,x+12

Tek bir argüman alan, ve çift listelerinin listesini döndüren tam bir program . Yukarıdaki kod son çıktıyı sıralamaz, ancak TIO bağlantısı sıralar.k


2

Haskell , 118107 bayt

Nimi sayesinde -11 bayt

q 1=[1]
q n=(:)<*>q.div n$[x|x<-[2..n],mod n x==0]!!0
f k|let r=all(<=k).q=[(n,n+1)|n<-[1..4^k],r n,r(n+1)]

Çevrimiçi deneyin!

  • q n tüm asal faktörlerin bir listesini hesaplar n
  • f klistesini oluşturur bütün çiftlerinin bir listesini filtreleyerek, belirli bir k Pürüzsüz çiftlerik

1
Sen aracılığıyla döngü can [2..n]içinde pve içine o satır içi q. Çevrimiçi deneyin!
nimi

1

Jöle , 24 bayt

³!²R‘Ė
ÇÆFḢ€€€’<³FȦ$€Tị¢

Çevrimiçi deneyin!

Bu 7 için uzun zaman alır, ancak faktöriyelerin karesini kaldırırsanız çok daha hızlı hesaplar: Çevrimiçi deneyin!

Açıklama:

³!²R‘Ė                Generates a list like [[1,2],[2,3],...]
³!²                  Take the square of the factorial of the input
   R                 Range 1 through through the above number.
    ‘Ė               Decrement and enumerate, yielding desired list


ÇÆFḢ€€€’<³FȦ$€Tị¢  
Ç                    Get the list of pairs  
 ÆF                  Get the prime factors of each number
   Ḣ€€€              Get the base of each
       ’<³           Is each base less than or equal to the input?
          FȦ$€       Check that all bases of a pair fit the above.
              T      Get a list of the truthy indexes
               ị¢    Index into the original list of pairs
                     Implicit output

@JonathanAllen sayesinde -3 bayt


1
Jelly'i okumuyorum, bunun nasıl çalıştığı hakkında bir açıklama yapabilir misiniz?
Cehaletin Somutlaştırılması

Bunun işe yaramadığını düşünmüyorum - ve(8,9) beri 3 pürüzsüz bir çift değil mi? 9 = 3 28=239=32
Jonathan Allan

Yine de olduğundan emin değilim. Bunun sizi tutacağını düşündüren nedir?
Jonathan Allan

@JonathanAllan Saf iyimserlik ve gördüğüm tüm örnekler için gerçek (kuşkusuz çok değil), en büyük çift daha küçüktür k!(küçük bir faktöre sahip olan 3 hariç, küçük bir sayıdır).
SparklePony Yoldaş

1
Kullandığınız üst sınır, çiftlerin sayısına göre değil, bir çiftte kullanılan maksimum sayıdır (ne zaman duracağınızı bilmeyeceğiniz için bu şekilde çiftlerin sayısına bir üst sınır uygulayamazsınız!) En büyük çiftin ürünü üzerinde bir üst sınır için teorem 7'ye bakınız.
Jonathan Allan

1

Python 3 + sympy, 116 bayt

import sympy
def f(k):x=[i for i in range(2,4**k)if max(sympy.factorint(i))<=k];return[(y,y+1)for y in x if y+1in x]

Çevrimiçi deneyin!

Python 3 + sympy, 111 bayt

from sympy import*
def f(k):
 b=1
 for i in range(2,4**k):
  x=max(factorint(i))<=k
  if x&b:print(i-1,i)
  b=x

Çevrimiçi deneyin!

Jelly'imde ama Python 3'te iki varyasyon var . İkisi de argümanı kabul eden bir işlev tanımlar k. Birincisi, kriterlere uyan çiftlerin tuples listesini döndürür. İkincisi onları stdout'a yazdırır.


1

Wolfram Dili (Mathematica) , 241 bayt

Pell denklemlerini kullanır

(s=#;v@a_:=Max[#&@@@#&/@FactorInteger@a]<=s;Select[{#-1,#+1}/2&/@(t={};k=y=1;While[k<=Max[3,(s+1)/2],If[IntegerQ[x=Sqrt[1+2y^2#]],t~AppendTo~x;k++];y++];t),v@#&]&/@Join[{1},Select[Range[3,Times@@Prime@Range@PrimePi@s],SquareFreeQ@#&&v@#&]])&

Çevrimiçi deneyin!



1

05AB1E , 16 bayt

°LʒfàI>‹}Xšü‚ʒ¥`

n>3

Açıklama:

°                # Take 10 to the power of the (implicit) input
 L               # Create a list in the range [1, 10^input]
  ʒ              # Filter this list by:
   fà            #  Get the maximum prime factor
     I>‹         #  And check if it's smaller than or equal to the input
        }Xš      # After the filter: prepend 1 again
           ü‚    # Create pairs
             ʒ   # And filter these pairs by:
              ¥` #  Where the forward difference / delta is 1


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.