すべての


13

前書き

数論では、その素因数がすべて最大kであるとき、数はk平滑であると言います。ので、例えば、2940 7滑らかで2940 = 2 23 5 7 2k2940=223572

ここでは、k -smoothのペアを、両方がk -smoothである2つの連続した整数として定義します。7平滑対の例は、あろう(4374,4375)ので、4374=237及び4375=547楽しい事実:これは実際には最大の7スムーズペアです。

ストーマーはことを1897年に証明したすべてのためk、有限個しか存在しk -smoothペア、そしてこの事実は、次のように知られているストーマーの定理

チャレンジ

あなたの仕事は、素数入力k与えられると、すべてを出力または返すプログラムまたは関数を書くことですk滑らかなペアを重複せず任意の順序で(ペア内の順序は関係ありません)ことです。

素数pおよびqでは、p<qであると仮定すると、すべてのp -smoothペアもq -smoothペアです。

サンプル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のテストケースを追加してください。
ジョナサンアラン

@JonathanAllan 2、3、および5のスムーズペアは7のスムーズペアに含まれていますが、わかりやすくするためにケースを追加します
浅本シエル

1
持っている(1, 2)義務的な出力の一部を..?
ケビンCruijssen

@KevinCruijssenはい、すべての出力に(1, 2)ペアが含まれている必要があります。
浅琴シエル

回答:


10

JavaScript(ES7)、 234  232バイト

x22qy2=1の形式のペル方程式を解くことにより解を求めます。ここで、qP平滑平方数です。

これは、Størmerの元の手順から派生したDerrick Henry Lehmerの手順の実装です。

キーと値が記述するオブジェクトを返します 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

オンラインでお試しください!

どうやって?

ヘルパー関数sは、指定された整数ni = 0で呼び出されたときにP滑らかな数であるか、i = 1で呼び出されたときに正方形のない1 P-滑らかな数であるかをテストしますi=0 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に-smooth番号[1..PP1]PP、上に向かうとして使用されているP!

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

上記の各数値n、ペル方程式x 2n y 2 =の基本解を探します。x2ny2=1

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

(上記のコードは、非再帰的なバージョンである私の答え、この他の挑戦

根本的な解決策後(x1,y1)発見された、我々は、溶液計算(xk,yk)kmax(3,(P+1)/2)、漸化式で:

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

xkについて、xkが奇数であり、(xk1)/2(xk+1)/2両方がP平滑であるかどうかをテストします。その場合、オブジェクト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:除数の素数性をテストしないため、関数sは、i=1呼び出された場合でも、実際にはいくつかの非平方自由数に対して真理になります。アイデアは、それらのほとんどをフィルタリングして、あまり多くの無駄なPell方程式が解決されないようにすることです。


こんにちはArnauld!私はちょうどこれら二つのまわりで私の頭をラップすることができませんでした:x = ~-x / 2-~P / 2.Areこれらの丸めのいくつかの種類...
ラーフルVermaの

1
@ rv7 ~xはビット単位のNOTであり、を計算し-(x+1)ます。したがって、~-xis -(-x+1)= x-1および-~xis -(-(x+1))= x+1です。JSのすべてのビット演算と同様に、32ビット整数部分のみが考慮されます。したがって、それらは実際に丸めに使用できます。ただし、ここではPはすでに整数です。xP
アーナウルド

4

ゼリー16 14バイト

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

オンラインでお試しください!

4kまでのペアをチェックします。これは、kが大きい場合には非効率的ですkがませんが、欠落がないことを確認する必要があります。

1バイトを節約してくれた@JonathanAllanに感謝します!

説明

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しかし、JonathanAllanは、それが常に十分な大きさであるかどうか確信を持っていませんでした。4 kが常に機能する場合 、説明を聞きたいと思います。4kk24k
同志SparklePony

1
迅速な返答に感謝致します。私は同じように考えていましたが、もっと大まかに言って、「階乗はすぐにかなり高くなります。おそらく十分大きいでしょう」(私がそれを二乗しない限りそうではなかったことが判明します)。より短く、より効率的なゴルフをおめでとう、あなたは私の賛成票を持っています。
同志SparklePony

1
注(oeis.org/A002072)「a(n)<10 ^ n / n(n = 4を除く。)(実験データから推測-MF Hasler、2015年1月16日」。特に証明できない限り、projecteuclid.org / download / pdf_1 / euclid.ijm / 1256067456 (定理7)のレーマーの弱点に固執する必要があると思います。
ジョナサンアラン

2
... Mathematics SEでこれを正確に尋ねる未解決の質問があります!
ジョナサンアラン

1
@PeterTaylorはペアの数であり、最大数ではありません。問題は、ペアの最大数の限界が検索を止めさせないことである
ニックケネディ


2

ゼリー、123バイト

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

オンラインでお試しください!

2×最大3k+12バツ12バツ+12各ソリューションでスムーズです。これは、質問のWikipediaリンクで説明されいるようにレーマーの方法です。

単一の引数を取る完全なプログラム、 kペアのリストのリストを返します。上記のコードは最終出力をソートしませんが、TIOリンクはソートします。


2

Haskell118107バイト

nimiのおかげで-11バイト

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 のリストを生成します 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

@JonathanAllenのおかげで-3バイト


1
私はゼリーを読みませんが、これがどのように機能するかについて説明してもらえますか?
無知の

私はこれが機能するとは思わない- (8,9)以来、3つの滑らかなペアではありません8=23 そして 9=32
ジョナサンアラン

それは確かではありません。何があなたにそれが成り立つと思いますか?
ジョナサンアラン

@JonathanAllan素朴な楽観主義と私が見たすべての例の事実(確かに多くはありません)、最大のペアは以下ですk!(3は例外で、小さいため階乗が小さい)。
同志SparklePony

1
使用している上限は、ペアの数ではなく、ペアで使用されている最大数です(この方法でペアの数に上限を実装することはできません。最大ペアの積の上限については、定理7を参照してください。
ジョナサンアラン

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

オンラインでお試しください!

Two variations on my Jelly answer but in Python 3. They both define a function which accepts an argument k. The first returns a list of tuples of the pairs that meet the criteria. The second prints them to 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 bytes

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

Run and debug it

This is not the shortest possible program, but it begins producing output as soon as matching pairs are found. It does terminate eventually, but output is produced as it's found.


0

Ruby, 89+8 = 97 bytes

Uses the -rprime flag. For each number i from 1 to 4n, map it to [i, i+1] if both are n-smooth, otherwise map it to false, then prune all false from the list.

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

Try it online!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.