Znajdź wszystkie pary


13

Wprowadzenie

W teorii liczb mówimy, że liczba jest gładka, gdy wszystkie jej czynniki pierwsze wynoszą co najwyżej . Na przykład 2940 jest 7-gładki, ponieważ .kk2940=223572

Tutaj definiujemy parę smooth jako dwie kolejne liczby całkowite, z których obie są smooth. Przykładem 7-gładkiej pary będzie ponieważ i . Ciekawostka: to właściwie największa 7-gładka para .kk(4374,4375)4374=2374375=547

Størmer udowodnił w 1897 r., Że dla każdego istnieje tylko skończenie wiele par gładkichkk , a fakt ten znany jest jako Twierdzenie Størmera .

Wyzwanie

Twoim zadaniem jest napisanie programu lub funkcji, która, biorąc pod uwagę liczbę podstawową , wypisuje lub zwraca wszystkie pary gładkich bez duplikowania (kolejność w parze nie ma znaczenia) w dowolnej kolejności.kk

Należy zauważyć, że dla liczb pierwszych i , przy założeniu, że , wszystkie pary gładkie są również parami gładkimi.pqp<qpq

Próbki we / wy

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)

Ograniczenie

Program lub funkcja powinny teoretycznie zakończyć się w skończonym czasie dla wszystkich danych wejściowych. Standardowe luki są domyślnie niedozwolone.

Zwycięskie kryteria

Ponieważ jest to wyzwanie związane z , wygrywa najkrótszy ważny zgłoszenie dla każdego języka.


2
Czy możesz dodać przypadki testowe dla 2, 3 i 5?
Jonathan Allan

@JonathanAllan 2-, 3- i 5- gładkie pary są zawarte w 7-gładkich parach, ale dodam przypadki dla jasności
Shieru Asakoto

1
Czy posiadanie (1, 2)części produkcji jest obowiązkowe?
Kevin Cruijssen

@KevinCruijssen Tak, wszystkie dane wyjściowe powinny zawierać (1, 2)parę.
Shieru Asakoto

Odpowiedzi:


10

JavaScript (ES7),  234  232 bajty

Znajduje rozwiązania, rozwiązując równania Pell w postaci , gdzie jest liczbą gładką kwadratową.x22qy2=1qP

Jest to implementacja procedury Derricka Henry'ego Lehmera , wywodząca się z oryginalnej procedury Størmera.

Zwraca obiekt, którego klucze i wartości opisują pary gładkie.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

Wypróbuj online!

W jaki sposób?

W funkcji pomocnika sprawdza, czy dany całkowita jest liczba -smooth gdy jest wywołana , lub kwadratowy wolny 1 liczba -smooth gdy jest wywoływana z .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)

Szukamy wszystkich wolnych od kwadratów liczb 1 gładkich w , gdzie jest używane jako górna granica dla.P[1..PP1]PPP!

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

Dla każdej liczby znalezionej powyżej szukamy podstawowego rozwiązania równania Pell :nx2ny2=1

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

(powyższy kod jest nierekurencyjną wersją mojej odpowiedzi na to inne wyzwanie )

Po znalezieniu podstawowego rozwiązania obliczamy rozwiązania pomocą , używając relacji powtarzalności:(x1,y1)(xk,yk)kmax(3,(P+1)/2)

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

Dla każdego sprawdzamy, czy jest nieparzyste i oba i są gładkie. Jeśli tak, przechowujemy je w obiekcie .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: Ponieważ nie testuje pierwotności dzielników, funkcja będzie faktycznie prawdziwa dla niektórych niekwadratowych liczb swobodnych, nawet jeśli zostanie wywołana z . Chodzi o to, aby odfiltrować większość z nich, aby rozwiązać zbyt wiele bezużytecznych równań Pell.si=1


Cześć Arnauld! Po prostu nie mogłem owinąć głowy wokół tych dwóch: x = ~-x / 2i. -~P / 2Czy są to jakieś zaokrąglenia ...
Rahul Verma

1
@ rv7 ~xto bitowe NIE, które oblicza -(x+1). Dlatego ~-xjest -(-x+1)= x-1i -~xjest -(-(x+1))= x+1. Podobnie jak wszystkie operacje bitowe w JS, uwzględniana jest tylko 32-bitowa część całkowita. Dlatego mogą być rzeczywiście używane do zaokrąglania. Ale zarówno jak i są już tutaj liczbami całkowitymi. P.xP
Arnauld

4

Galaretka , 16 14 bajtów

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

Wypróbuj online!

Sprawdza pary do co jest nieefektywne dla większych ale powinno zapewnić, że żadna nie zostanie pominięta.4kk

Dzięki @JonathanAllan za uratowanie 1 bajtu!

Wyjaśnienie

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
Czy jesteś pewien, że zawsze będzie wystarczająco duże? W moim rozwiązaniu użyłem ale JonathanAllan nie był pewien, czy zawsze będzie wystarczająco duży. Jeśli zawsze działa, chciałbym usłyszeć wyjaśnienie. k ! 2 4 k4kk!24k
Towarzysz SparklePony,

1
Dziękuję za szybką odpowiedź. Myślałem podobnie, ale szerzej: „czynnik jest dość wysoki, prawdopodobnie jest wystarczająco duży”. (okazuje się, że tak nie było, chyba że go wyprostowałem). Gratulacje z powodu krótszego i bardziej wydajnego golfa, masz moje poparcie.
Towarzysz SparklePony,

1
Uwaga (z oeis.org/A002072 ) „a (n) <10 ^ n / n, z wyjątkiem n = 4. (Przypuszczenie, z danych eksperymentalnych) - MF Hasler, 16 stycznia 2015 r.”. Myślę, że musimy trzymać się słabej granicy Lehmera w projecteuclid.org/download/pdf_1/euclid.ijm/1256067456 (twierdzenie 7), chyba że możemy udowodnić inaczej.
Jonathan Allan

2
... na Mathematics SE jest otwarte pytanie , które też dokładnie o to pyta!
Jonathan Allan

1
@PeterTaylor, który dotyczy liczby par, a nie maksymalnej liczby. Problem polega na tym, że ograniczenie maksymalnej liczby par nie pozwala ci przestać szukać
Nick Kennedy

3

05AB1E , 8 bajtów

°Lü‚ʒfà@

Wypróbuj online!

Wyjaśnienie:

°            # 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

Galaretka , 123 bajty

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

Wypróbuj online!

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

Pełny program, który pobiera pojedynczy argument, i zwraca listę list par. Powyższy kod nie sortuje ostatecznego wyniku, ale robi to łącze TIO.k


2

Haskell , 118 107 bajtów

-11 bajtów dzięki nim

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

Wypróbuj online!

  • q n oblicza listę wszystkich czynników pierwszych n
  • f kgeneruje listę par gładkich dla danego k, filtrując listę wszystkich park

1
Można poprzez pętlę [2..n]wewnątrz pi na nim inline q. Wypróbuj online!
nimi

1

Galaretka , 24 bajty

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

Wypróbuj online!

Zajmuje to dużo czasu dla 7, ale oblicza się znacznie szybciej, jeśli usuniesz kwadrat silni: Wypróbuj online!

Wyjaśnienie:

³!²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

-3 bajty dzięki @JonathanAllen


1
Nie czytam Galaretki, czy możesz wyjaśnić, jak to działa?
Embodiment of Ignorance

(8,9)8=239=32

Nie jestem jednak pewien. Co sprawia, że ​​myślisz, że to się utrzyma?
Jonathan Allan

@JonathanAllan Naiwny optymizm i fakt, że we wszystkich przykładach, które widziałem (co prawda niewielu), największa para jest mniejsza niż k!(z wyjątkiem 3, która ma niewielką silnię, ponieważ jest małą liczbą).
Towarzysz SparklePony,

1
Używana górna granica dotyczy maksymalnej liczby użytej w parze, a nie liczby par (nie możesz w ten sposób wprowadzić górnej granicy liczby par, ponieważ nie będziesz wiedział, kiedy przestać szukać!) Zobacz twierdzenie 7 dla górnej granicy iloczynu największej pary.
Jonathan Allan

1

Python 3 + sympy, 116 bajtów

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]

Wypróbuj online!

Python 3 + sympy, 111 bajtów

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

Wypróbuj online!

Dwie odmiany mojej odpowiedzi na żelki, ale w Pythonie 3. Obie definiują funkcję, która przyjmuje argument k. Pierwszy zwraca listę krotek par, które spełniają kryteria. Drugi drukuje je na standardowe wyjście.


1

Wolfram Language (Mathematica) , 241 bajtów

używa równań Pell

(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@#&]])&

Wypróbuj online!



1

05AB1E , 16 bajtów

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

n>3

Wyjaśnienie:

°                # 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

0

Stax , 14 bajtów

Θ",²aÇu,á‼⌐çLB

Uruchom i debuguj

To nie jest najkrótszy możliwy program, ale zaczyna generować dane wyjściowe, gdy tylko zostaną znalezione pasujące pary. Kończy się ostatecznie , ale dane wyjściowe są wytwarzane w miarę ich znajdowania.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.