Tìm tất cả các cặp -smooth


13

Giới thiệu

Trong lý thuyết số, chúng ta nói một số là -smooth khi các thừa số nguyên tố của nó nhiều nhất là . Ví dụ: 2940 mượt 7 vì .kk2940= =223572

Ở đây, chúng tôi định nghĩa một cặp -smooth là hai số nguyên liên tiếp mà cả hai đều là -smooth. Một ví dụ về cặp 7 trơn sẽ là vì và . Sự thật thú vị: Đây thực sự là cặp 7 số lớn nhất .kk(4374,4375)4374= =2374375= =547

Størmer đã chứng minh vào năm 1897 rằng với mỗi , chỉ có rất nhiều cặp -smoothkk và thực tế này được gọi là Định lý Størmer .

Thử thách

Nhiệm vụ của bạn là viết một chương trình hoặc hàm, với đầu vào số nguyên tố , xuất hoặc trả về tất cả các cặp -smooth mà không trùng lặp (thứ tự trong cặp không quan trọng) theo bất kỳ thứ tự nào bạn muốn.kk

Xin lưu ý rằng đối với các số nguyên tố và , giả sử , tất cả các cặp -smooth cũng là các cặp -smooth.pqp<qpq

Mẫu I / O

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)

Sự hạn chế

Về mặt lý thuyết, chương trình hoặc chức năng nên chấm dứt trong thời gian hữu hạn cho tất cả các đầu vào. Các sơ hở tiêu chuẩn không được phép theo mặc định.

Tiêu chí chiến thắng

Vì đây là một thử thách , bài nộp hợp lệ ngắn nhất cho mỗi ngôn ngữ sẽ thắng.


2
Bạn có thể vui lòng thêm các trường hợp thử nghiệm cho 2, 3 và 5 không?
Jonathan Allan

Các cặp trơn tru
@Jonathan ALLan

1
(1, 2)một phần của đầu ra bắt buộc phải không? ..
Kevin Cruijssen

@KevinCruijssen Có, tất cả các kết quả đầu ra nên chứa (1, 2)cặp.
Shieru Asakoto

Câu trả lời:


10

JavaScript (ES7),  234  232 byte

Tìm các nghiệm bằng cách giải phương trình Pell có dạng x22qy2=1 , trong đó q là số tự do P -smooth vuông.

Đây là một triển khai của thủ tục Derrick Henry Lehmer , xuất phát từ thủ tục ban đầu của Størmer.

Trả về một đối tượng có khóa và giá trị mô tả các cặp P -smooth.

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

Hãy thử trực tuyến!

Làm sao?

Chức năng helper s kiểm tra xem một số nguyên cho n là một P số -smooth khi nó được gọi với i=0 , hoặc miễn phí vuông 1 P số -smooth khi nó được gọi với Tôi= =1 .

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

Chúng tôi tìm tất cả các số 1 P -smooth vuông miễn phí trong [1 ..PP-1] , trong đó PP được sử dụng làm giới hạn trên cho P!.

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

Với mỗi số n được tìm thấy ở trên, chúng tôi tìm giải pháp cơ bản của phương trình Pell x2-ny2= =1 :

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

(đoạn mã trên là phiên bản không đệ quy của câu trả lời của tôi cho thử thách khác này )

Khi đã tìm thấy giải pháp cơ bản (x1,y1) , chúng tôi tính toán các giải pháp (xk,yk) với kmmộtx(3,(P+1)/2) , sử dụng các quan hệ lặp lại:

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

Với mỗi xk , chúng tôi kiểm tra xem xk có phải là số lẻ hay không và cả (xk-1)/2(xk+1)/2 đều là P -smooth. Nếu vậy, chúng tôi lưu trữ chúng trong đối tượng r .

( 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ởi vì nó không kiểm tra tính nguyên thủy của các ước số, nên hàm S thực sự sẽ là sự thật đối với một số số không vuông, ngay cả khi nó được gọi với Tôi= =1 . Ý tưởng là lọc hầu hết chúng để không giải được quá nhiều phương trình Pell vô dụng.


Xin chào Arnauld! Tôi chỉ không thể quấn đầu quanh hai người này: x = ~-x / 2và. -~P / 2Có phải đây là một kiểu làm tròn ...
Rahul Verma

1
@ rv7 ~xlà bit bit KHÔNG, tính toán -(x+1). Do đó, ~-xis -(-x+1)= x-1-~xis -(-(x+1))= x+1. Giống như tất cả các hoạt động bitwise trong JS, chỉ có phần nguyên 32 bit được tính đến. Vì vậy, chúng thực sự có thể được sử dụng để làm tròn. Nhưng cả P đều là số nguyên ở đây. xP
Arnauld

4

Thạch , 16 14 byte

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

Hãy thử trực tuyến!

Kiểm tra các cặp lên đến 4k không hiệu quả đối với k lớn hơn nhưng phải đảm bảo không bỏ sót.

Cảm ơn @Jonathan ALLan vì đã tiết kiệm 1 byte!

Giải trình

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
Bạn có chắc chắn rằng sẽ luôn đủ lớn? Trong giải pháp của tôi, tôi đã sử dụng k ! 2 nhưng Jonathan ALLan không chắc chắn rằng nó sẽ luôn đủ lớn. Nếu 4 k luôn hoạt động, tôi sẽ tò mò muốn nghe một lời giải thích. 4kk!24k
Đồng chí SparklePony

1
Cảm ơn đã phản ứng nhanh chóng. Tôi đã suy nghĩ tương tự, nhưng rộng hơn: "giai thừa trở nên khá cao nhanh chóng, nó có thể đủ lớn." (hóa ra nó không phải trừ khi tôi bình phương nó). Xin chúc mừng cho golf ngắn hơn và hiệu quả hơn, bạn có upvote của tôi.
Đồng chí SparklePony

1
Lưu ý (từ oeis.org/A002072 ) "a (n) <10 ^ n / n ngoại trừ n = 4. (Phỏng đoán, từ dữ liệu thử nghiệm.) - MF Hasler, ngày 16 tháng 1 năm 2015". Tôi nghĩ rằng chúng ta phải gắn bó với giới hạn yếu của Lehmer trong projecteuclid.org/doad/pdf_1/euclid.ijm/1256067456 (định lý 7) trừ khi chúng ta có thể chứng minh khác.
Jonathan Allan

2
... Có một câu hỏi mở về Toán học SE cũng hỏi chính xác điều này!
Jonathan Allan

1
@PeterTaylor đó là số lượng cặp, không phải số lượng tối đa. Vấn đề là biết ràng buộc về số lượng cặp tối đa không cho phép bạn ngừng tìm kiếm
Nick Kennedy

3

05AB1E , 8 byte

°Lü‚ʒfà@

Hãy thử trực tuyến!

Giải trình:

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

Thạch , 123 byte

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

Hãy thử trực tuyến!

2×tối đa(3,k+12)x-12,x+12

k



1

Thạch , 24 byte

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

Hãy thử trực tuyến!

Điều này mất nhiều thời gian cho 7, nhưng nó tính toán nhanh hơn nhiều nếu bạn loại bỏ bình phương của giai thừa: Hãy thử trực tuyến!

Giải trình:

³!²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 byte nhờ @Jonathan ALLen


1
Tôi không đọc Jelly, bạn có thể giải thích về cách thức hoạt động của nó không?
Hiện thân của sự thiếu hiểu biết

(8,9)số 8= =239= =32

Tôi không chắc đó là mặc dù. Điều gì làm cho bạn nghĩ rằng sẽ giữ?
Jonathan Allan

@Jonathan ALLan Sự lạc quan ngây thơ và thực tế cho tất cả các ví dụ tôi đã thấy (phải thừa nhận là không nhiều), cặp lớn nhất ít hơn k!(ngoại trừ 3, có một yếu tố nhỏ vì nó là một con số nhỏ).
Đồng chí SparklePony

1
Giới hạn trên mà bạn đang sử dụng là số lượng tối đa được sử dụng trong một cặp, không phải trên số lượng cặp (bạn không thể thực hiện giới hạn trên về số lượng cặp theo cách này vì bạn sẽ không biết khi nào nên ngừng tìm kiếm!) Xem định lý 7 để biết giới hạn trên của sản phẩm của cặp lớn nhất.
Jonathan Allan

1

Python 3 + sympy, 116 byte

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]

Hãy thử trực tuyến!

Python 3 + sympy, 111 byte

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

Hãy thử trực tuyến!

Hai biến thể trong câu trả lời Jelly của tôi nhưng trong Python 3. Cả hai đều xác định một hàm chấp nhận một đối số k. Cái đầu tiên trả về một danh sách các bộ dữ liệu của các cặp đáp ứng các tiêu chí. Thứ hai in chúng ra thiết bị xuất chuẩn.




1

05AB1E , 16 byte

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

n>3

Giải trình:

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

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

Chạy và gỡ lỗi nó

Đây không phải là chương trình ngắn nhất có thể, nhưng nó bắt đầu tạo đầu ra ngay khi tìm thấy các cặp phù hợp. Cuối cùng nó chấm dứt , nhưng đầu ra được sản xuất như nó tìm thấy.


0

Ruby , 89 + 8 = 97 byte

Sử dụng -rprimecờ. Cho mỗi sốTôi từ 1 đến 4n, ánh xạ nó tới [i, i+1]nếu cả hain-smooth, nếu không thì ánh xạ nó tới false, sau đó tỉa tất cả falsetừ danh sách.

->n{g=->x{x.prime_division.all?{|b,_|b<=n}};(1..4**n).map{|i|g[i]&&g[i+1]&&[i,i+1]}-[!1]}

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.