ギルブレスの予想


18

無限数の素数のリストから始めると仮定します。

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, ...

次に、数値の各ペア間の絶対差を繰り返し取得します。

[1, 2, 2, 4, 2, 4, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, ...
[1, 0, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 0, 4, 4, 2, ...
[1, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 4, 0, 2, ...
[1, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 4, 2, ...

先頭の数字が毎回1であることに注意してください。ギルブレスの予想は、これが永遠に続くという予測です。

先頭の数字が1でなくなるのは、次の数字が0でも2でもない場合だけです。2番目の数字が0でも2でもない場合は、その後の数字が0でも2でもない場合のみです0でも2でもあります。

先頭の1以外の最も早い番号のインデックスは、0でも2でもないため、連続するシーケンスのペア間で1を超えることはありません。この事実は、シーケンスが最初の要素として1を持たない可能性がある場合に、非常に強力な下限を設定するために使用されています。

このチャレンジでは、シーケンスのインデックスが与えられ、そのシーケンスの先頭の1ではなく、0または2でもない最初の番号のインデックスを出力する必要があります。

たとえば、上記の4番目の絶対差分シーケンスでは:

[1, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 4, 2, ...

最初のエントリ以外のゼロでも2でもない最初のエントリは、15番目の位置で、14のインデックスが付けられています。したがって、入力が4の場合、14を出力します。

1〜30の入力の場合、出力は次のようになります。

[3, 8, 14, 14, 25, 24, 23, 22, 25, 59, 98, 97, 98, 97, 174, 176, 176, 176, 176, 291, 290, 289, 740, 874, 873, 872, 873, 872, 871, 870]

これはOEIS A000232です。

これは、1つのインデックス付き入力と0つのインデックス付き出力があると仮定しています。すべてのシーケンスに対応する入力の範囲を受け入れることができる限り、任意の定数整数で始まる入力と出力にインデックスを付けることができます。

要件:ソリューションは、最大30の入力で最大1分間実行する必要があります。コンピューターの仕様に依存するほど近い場合は許可されます。

最短のコードが優先されます。


入力を2インデックス化できますか?
リーキー修道女

@LeakyNun確かに。
isaacg

出力で入力ベースのインデックスを使用できますか?
ルイスメンドー

@LuisMendo修正、修正。いいえ、インデックスは定数でなければなりません。
isaacg

回答:



4

Mathematica、66バイト

(For[z=1,Last@Nest[Abs@*Differences,Array[Prime,z+#],#]<3,z++];z)&

引数として正の整数を取り、1インデックス付き整数を返す純粋な関数。最初の素数のリストNest[Abs@*Differences,Array[Prime,z+#],#]#th回繰り返された絶対差分リストを計算しz+#ます。For[z=1,Last@...<3,z++]結果のリストの最後の要素が少なくとも3になるまでこの計算をループし、z出力されます。(アルゴリズムの正確さは、Gilbreathの推測を前提としていることに注意してください!)



2

MATL、18バイト

`@:YqG:"d|]3<A}@G-

入力と出力は1ベースです。各テストケースのTIOでかかる時間は40秒未満です。

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

説明

これは、反復された絶対連続差分がを超える値を少なくとも1つ与えるまで、より長い素数の初期シーケンスを試行し続けます2

`        % Do... while loop
  @:Yq   %   Array of first k primes, where k is iteration index
  G:"    %   Do this as many times as the input
    d|   %     Absolute value of consecutive differences
  ]      %   End
  3<A    %   Are they all less than 3? This is the loop condition
}        % Finally (execute before exiting loop)
  @G-    %   Push last iteration index minus input. This is the output
         % End (implicit). Continue with next iteration if top of stack is true
         % Display (implicit)

1

Perl 6の136の 120バイト

{->\i,\n{i??&?BLOCK(i-1,lazy
n.rotor(2=>-1).map: {abs .[1]-.[0]})!!1+n.skip.first:
:k,none 0,2}($_,grep &is-prime,2..*)}

ゴルフをしていない:

{   # Anonymous function with argument in $_
    sub f(\i, \n) {  # Recursive helper function
        if i != 0 {  # If we're not done,
            # Recurse on the absolute differences between adjacent entries:
            f(i - 1, lazy n.rotor(2 => -1).map: { abs .[1] - .[0] });
        } else {
            # Otherwise, return the first index after 0
            # where the value is neither 0 nor 2.
            1 + n.skip.first: :k, none 0, 2;
        }
    }
    # Call the helper function with the argument passed to the top-level
    # anonymous function (the recursion depth), and with the prime numbers
    # as the initial (infinite, lazy) list:
    f($_, grep &is-prime, 2 .. *);
}

入力が30の場合、この機能は控えめなラップトップで約4秒で実行されます。

...これは、7か月前のPerl 6インストールをアップグレードしてから1.4秒後になります(これによりskip、最初のソリューションから数バイトを削ることができます)。1から30までのすべてのテストケースには約10秒かかります。


1

Haskell、94バイト

f(a:b:r)=abs(a-b):f(b:r)
length.fst.span(<3).(iterate f[n|n<-[2..],all((>0).mod n)[2..n-1]]!!)

オンラインでお試しください!最後の行は匿名関数です。例えばにバインドしg、のように呼び出しますg 4。すべてのテストケースを組み合わせて、TIOで2秒未満かかります。

使い方

[n|n<-[2..],all((>0).mod n)[2..n-1]]素数の無限リストを生成します。
f(a:b:r)=abs(a-b):f(b:r)は、無限リストの要素の絶対差を生成する関数です。数値を指定するとn、素数のリストに時間を(iterate f[n|n<-[2..],all((>0).mod n)[2..n-1]]!!)適用しますf nlength.fst.span(<3)要素がより小さい結果リストのプレフィックスの長さを計算します3。


0

公理、289バイト

g(n:PI):PI==(k:=n*10;c:List NNI:=[i for i in 1..(k quo 2)|prime?(i)];repeat(a:=concat(c,[i for i in (k quo 2+1)..k|prime?(i)]);j:=0;c:=a;repeat(j=n=>break;j:=j+1;b:=a;a:=[abs(b.(i+1)-b.i)for i in 1..(#b-1)]);j:=2;repeat(j>#a=>break;a.j~=2 and a.j~=1 and a.j~=0=>return j-1;j:=j+1);k:=k*2))

ungolf it and test

f(n:PI):PI==
  k:=n*10
  c:List NNI:=[i for i in 1..(k quo 2)|prime?(i)]
  repeat
    a:=concat(c,[i for i in (k quo 2+1)..k|prime?(i)])
    j:=0;c:=a
    repeat
       j=n=>break
       j:=j+1
       b:=a
       a:=[abs(b.(i+1)-b.i)  for i in 1..(#b-1)]
    j:=2
    repeat
       j>#a=>break
       a.j~=2 and a.j~=1 and a.j~=0 => return j-1
       j:=j+1
    k:=k*2

(4) -> [g(i)  for i in 1..30]
   (4)
   [3, 8, 14, 14, 25, 24, 23, 22, 25, 59, 98, 97, 98, 97, 174, 176, 176, 176,
    176, 291, 290, 289, 740, 874, 873, 872, 873, 872, 871, 870]

ソリューションが見つからない場合は、2 * xの素数リストをループで展開し、残りのリストをすべて再計算します。find g(30)の場合は3秒

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