ค้นหาคู่ -smooth ทั้งหมด


13

บทนำ

ในทฤษฎีจำนวนที่เราพูดเป็นจำนวนพร้อมตัวล็อกกันเมื่อปัจจัยสำคัญที่มีทั้งหมดในที่สุดkยกตัวอย่างเช่น 2940 คือ 7-Smooth เพราะ 2kk2940=223572

ที่นี่เรากำหนดคู่ -smooth เป็นจำนวนเต็มต่อเนื่องสองตัวซึ่งทั้งคู่เป็น -smooth ตัวอย่างของคู่ 7 เรียบจะเพราะและ4375สนุกจริง: นี้เป็นจริงที่ใหญ่ที่สุดคู่kk(4374,4375)4374=2374375=547

Stormer พิสูจน์แล้วว่าในปี 1897 ที่ทุกมีเพียงขีดหลายพร้อมตัวล็อกกันคู่kkและความจริงนี้เป็นที่รู้จักกันStormer ทฤษฎีบท

ท้าทาย

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่กำหนดให้ใส่หมายเลขเฉพาะส่งออกหรือส่งกลับคู่ -smooth ทั้งหมดโดยไม่ซ้ำกัน (ลำดับภายในคู่ไม่สำคัญ) ในลำดับใด ๆ ที่คุณต้องการkk

โปรดสังเกตว่าสำหรับตัวเลขที่สำคัญและสมมติทั้งหมดพร้อมตัวล็อกกันคู่นี้ยังมีพร้อมตัวล็อกกันคู่pqp<qpq

ตัวอย่าง 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)

การ จำกัด

โปรแกรมหรือฟังก์ชั่นควรยุติตามทฤษฎีในเวลาที่ จำกัด สำหรับอินพุตทั้งหมด ช่องโหว่มาตรฐานจะไม่ได้รับอนุญาตตามค่าเริ่มต้น

เกณฑ์การชนะ

เนื่องจากนี่เป็นความท้าทายของนักที่ส่งผลงานได้ถูกต้องที่สุดสำหรับแต่ละภาษา


2
คุณช่วยเพิ่มกรณีทดสอบสำหรับ 2, 3 และ 5 ได้ไหม
Jonathan Allan

@JanathanAllan 2, 3 และ 5 คู่เรียบถูกรวมอยู่ในคู่ 7-smooth แต่ฉันจะเพิ่มกรณีเพื่อความชัดเจน
4329 Shieru

1
จะมี(1, 2)ส่วนหนึ่งของการส่งออกบังคับ .. ?
เควิน Cruijssen

@KevinCruijssen ใช่เอาต์พุตทั้งหมดควรมี(1, 2)คู่
Shieru Asakoto

คำตอบ:


10

JavaScript (ES7),  234  232 ไบต์

ค้นหาวิธีแก้ปัญหาด้วยการแก้สมการ Pell ของรูปแบบโดยที่คือตัวเลขฟรีสแควร์ smoothx22qy2=1qP

นี่คือการดำเนินการตามกระบวนการของDerrick Henry Lehmerซึ่งได้มาจากกระบวนการดั้งเดิมของStørmer

ส่งคืนวัตถุที่มีคีย์และค่าอธิบายคู่ -smoothP

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

ลองออนไลน์!

อย่างไร?

ผู้ช่วยฟังก์ชั่นการทดสอบไม่ว่าจะเป็นจำนวนเต็มให้เป็นจำนวนพร้อมตัวล็อกกันเมื่อมันเรียกว่ามีหรือฟรีตาราง1จำนวนพร้อมตัวล็อกกันเมื่อมันเรียกว่ามี 1snPi=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)

เรามองหาตารางฟรีตลอด1 หมายเลขพร้อมตัวล็อกกันในที่ใช้เป็นที่ถูกผูกไว้บนสำหรับ.P[1..PP1]PPP!

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

สำหรับแต่ละหมายเลขพบข้างต้นเราค้นหาวิธีแก้ปัญหาพื้นฐานของสมการ Pell :nx2ny2=1

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

(รหัสดังกล่าวเป็นรุ่นที่ไม่ใช่ recursive ของคำตอบของฉันที่จะท้าทายอื่น ๆ )

เมื่อพบโซลูชันพื้นฐานแล้วเราจะคำนวณโซลูชันด้วยโดยใช้ความสัมพันธ์ที่เกิดซ้ำ:(x1,y1)(xk,yk)kmax(3,(P+1)/2)

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

สำหรับแต่ละเราทดสอบว่าแปลกและทั้งคู่และเป็น -smooth ถ้าเป็นเช่นนั้นเราเก็บไว้ในวัตถุRxkxk(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: เพราะมันไม่ได้ทดสอบ primality ของตัวหารที่ฟังก์ชั่นจริงจะ truthy สำหรับตัวเลขบางอย่างไม่ใช่สแควร์ฟรีแม้ว่าจะเรียกว่ามี 1 ความคิดคือการกรองส่วนใหญ่ของพวกเขาเพื่อไม่ให้แก้สมการเพลล์ไร้ประโยชน์มากเกินไปsi=1


สวัสดี Arnauld! ฉันไม่สามารถตัดหัวของฉันรอบสองเหล่านี้: x = ~-x / 2และ-~P / 2.Are เหล่านี้บางชนิดการปัดเศษ ...
ราหุล Verma

1
@ rv7 เป็นค่าที่เหมาะสมไม่ซึ่งคำนวณ~x -(x+1)ดังนั้น~-xเป็น-(-x+1)= x-1และ-~xเป็น=-(-(x+1)) x+1เช่นเดียวกับการดำเนินการระดับบิตทั้งหมดใน JS เฉพาะส่วนจำนวนเต็ม 32 บิตเท่านั้นที่ถูกนำมาพิจารณา ดังนั้นพวกเขาจึงสามารถนำมาใช้ในการปัดเศษ แต่ทั้งและเป็นจำนวนเต็มตรงนี้แล้ว PxP
Arnauld

4

เยลลี่ , 16 14 ไบต์

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

ลองออนไลน์!

ตรวจสอบคู่ที่มากถึงซึ่งไม่มีประสิทธิภาพสำหรับขนาดใหญ่กว่าแต่ควรแน่ใจว่าไม่มีใครพลาด4kk

ขอบคุณ @JonathanAllan สำหรับการบันทึก 1 ไบต์!

คำอธิบาย

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
คุณแน่ใจหรือว่าจะมีขนาดใหญ่เพียงพอเสมอ ในการแก้ปัญหาของฉันฉันใช้แต่โจนาธานอัลลันไม่แน่ใจว่ามันจะใหญ่พอเสมอ ถ้า ทำงานได้ตลอดเวลาฉันอยากรู้อยากเห็นคำอธิบาย k ! 2 4 k4kk!24k
สหาย SparklePony

1
ขอบคุณสำหรับการตอบสนองอย่างรวดเร็ว. ฉันคิดในทำนองเดียวกัน แต่กว้างกว่า: "แฟคทอเรียลสูงขึ้นอย่างรวดเร็วมันอาจใหญ่พอ" (กลับกลายเป็นว่าไม่ได้นอกจากว่าฉันจะยกกำลังสอง) ขอแสดงความยินดีกับสนามกอล์ฟที่สั้นและมีประสิทธิภาพยิ่งขึ้น
สหาย SparklePony

1
หมายเหตุ (จากoeis.org/A002072 ) "a (n) <10 ^ n / n ยกเว้น n = 4 (คาดการณ์จากข้อมูลการทดลอง) - MF Hasler, 16 มกราคม 2015" ฉันคิดว่าเราต้องยึดติดกับขอบเขตที่อ่อนแอของ Lehmer ในprojecteuclid.org/download/pdf_1/euclid.ijm/1256067456 (ทฤษฎีบท 7) เว้นแต่เราจะพิสูจน์ได้เป็นอย่างอื่น
Jonathan Allan

2
... มีคำถามเปิดในMathematics SE ที่ถามตรงนี้ด้วย!
Jonathan Allan

1
@PeterTaylor เป็นจำนวนคู่ไม่ใช่จำนวนสูงสุด ปัญหาคือการรู้ขอบเขตของจำนวนสูงสุดของคู่ไม่ให้คุณหยุดการค้นหา
Nick Kennedy


2

เยลลี่ 123 ไบต์

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

ลองออนไลน์!

นี่เป็นคำตอบของเจลลี่ที่ค่อนข้างมีประสิทธิภาพ แต่ใช้เวลานานซึ่งใช้วิธีเศษส่วนต่อเนื่องเพื่อแก้ปัญหาพื้นฐานสำหรับสมการ Pell สำหรับแต่ละจำนวนสแควร์ k-smooth k ฟรีจำนวนพบโซลูชันสำหรับแต่ละรายการจากนั้นตรวจสอบว่าราบรื่นสำหรับแต่ละโซลูชันหรือไม่ นี่คือวิธีการ Lehmer ฯ ตามที่อธิบายไว้ในคำถามของการเชื่อมโยงวิกิพีเดีย2×max(3,k+12)x12,x+12

โปรแกรมเต็มรูปแบบที่รับอาร์กิวเมนต์ตัวเดียวและส่งคืนรายการของคู่ รหัสด้านบนไม่ได้เรียงลำดับผลลัพธ์สุดท้าย แต่ลิงก์ TIO ทำk


2

Haskell , 118 107 ไบต์

-11 ไบต์ขอบคุณ nimi

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

ลองออนไลน์!

  • q n คำนวณรายการปัจจัยหลักทั้งหมดของ n
  • f kสร้างรายการของคู่ -smooth สำหรับ k ที่กำหนดโดยการกรองรายการของคู่ทั้งหมดk

1
คุณสามารถห่วงผ่าน[2..n]ภายในและมันกลายเป็นแบบอินไลน์p ลองออนไลน์! q
nimi

1

เยลลี่ 24 ไบต์

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

ลองออนไลน์!

การดำเนินการนี้ใช้เวลานานสำหรับ 7 แต่จะคำนวณได้เร็วกว่ามากหากคุณลบการยกกำลังสองของแฟคทอเรียล: ลองออนไลน์!

คำอธิบาย:

³!²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 ไบต์ขอบคุณ @JonathanAllen


1
ฉันไม่ได้อ่าน Jelly คุณช่วยอธิบายวิธีการทำงานของมันได้มั้ย
ศูนย์รวมแห่งความไม่รู้

ฉันไม่คิดว่าจะใช้งานได้ - ไม่ใช่(8,9)คู่ที่ลื่นไหลตั้งแต่และ ? 9 = 3 28=239=32
Jonathan Allan

ฉันไม่แน่ใจว่ามันเป็น อะไรที่ทำให้คุณคิดว่าจะถือ?
Jonathan Allan

@ โจนาธานอัลลันไร้เดียงสาในแง่ดีและความจริงสำหรับทุกตัวอย่างที่ฉันเคยเห็น (ยอมรับไม่มาก) คู่ที่ใหญ่ที่สุดนั้นน้อยกว่าk!(ยกเว้น 3 ซึ่งมีแฟกทอเรียลเล็ก ๆ เพราะเป็นจำนวนน้อย)
สหาย SparklePony

1
ขอบเขตด้านบนที่คุณใช้นั้นเป็นจำนวนสูงสุดที่ใช้ในคู่ไม่ใช่ในจำนวนคู่ (คุณไม่สามารถใช้ขอบเขตบนบนจำนวนคู่ด้วยวิธีนี้เมื่อคุณไม่ทราบว่าเมื่อใดจะหยุดมอง!) ดูทฤษฎีบท 7 สำหรับขอบเขตบนของผลิตภัณฑ์ของคู่ที่ใหญ่ที่สุด
Jonathan Allan

1

Python 3 + sympy, 116 ไบต์

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]

ลองออนไลน์!

Python 3 + sympy, 111 ไบต์

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

ลองออนไลน์!

สองรูปแบบในของฉันคำตอบวุ้นแต่ในหลาม 3. kพวกเขาทั้งสองกำหนดฟังก์ชันที่รับอาร์กิวเมนต์ ครั้งแรกส่งกลับรายการของ tuples ของคู่ที่ตรงกับเกณฑ์ วินาทีพิมพ์ลงใน stdout




1

05AB1E , 16 ไบต์

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

ลองใช้ออนไลน์ (ไม่มีประสิทธิภาพอย่างยิ่งดังนั้นหมดเวลากับ .. ) ที่นี่เป็นทางเลือกที่เร็วขึ้นเล็กน้อยแม้ว่าจะยังค่อนข้างช้า ..n>3

คำอธิบาย:

°                # 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 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

นี่ไม่ใช่โปรแกรมที่สั้นที่สุด แต่จะเริ่มต้นสร้างเอาต์พุตทันทีที่พบคู่ที่ตรงกัน มันจะยุติในที่สุดแต่ผลผลิตที่ผลิตตามที่พบ


0

Ruby , 89 + 8 = 97 ไบต์

ใช้-rprimeธง สำหรับแต่ละหมายเลขจาก 1 ถึงให้จับคู่กับหากทั้งคู่เป็น smooth ไม่เช่นนั้นก็จับคู่กับแล้วตัดทั้งหมดจากรายการi4n n[i, i+1]nfalsefalse

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

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.