好奇心の素数式


17

正の整数nを出力すると、整数aおよびb簡約された小数部a / bを形成)は次のようになります。

式a / b = k = 1からnの積:(p_k ^ 2-1)/(p_k ^ 2 + 1)

ここで、p kk番目の素数です(p 1 = 2)。

例:

1   -> 3, 5
2   -> 12, 25
3   -> 144, 325
4   -> 3456, 8125
5   -> 41472, 99125
15  -> 4506715396450638759507001344, 11179755611058498955501765625
420 -> very long

確率的素数チェックは許可されており、言語の整数型の制限により回答が失敗した場合でも問題ありません。


バイト単位の最短コードが優先されます。


3.0代わりに出力することもできます3か?
アドナン

2
@AandN推測しますが、プログラムがすべての入力に対して正しいことを確認してください。また、大きな入力に対して浮動小数点エラーが発生しないようにしてください。
orlp

我々は、出力することができますaし、b合理的なタイプとして?
アレックスA.

2
@AlexA。出力に両方の整数が明確に表示されている場合のみ。
orlp

1
@SamYonnouこれらは既に存在しますが、問題を簡単にするためにネイティブの数値型を悪用することは、デフォルトで禁止されている抜け穴の1つです。
デニス

回答:


6

M、9バイト

RÆN²‘İḤCP

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

トリビア

Mに会おう!

Mは、ゼリーのフォークで、数学的な課題を対象としています。JellyとMの主な違いは、Mがすべての内部計算に無限の精度を使用し、結果を象徴的に表すことです。Mがより成熟すると、ゼリーは次第に多目的になり、数学指向になります。

Mは、進行中の非常に多くの作業です(バグの完全な、と本当にそのゼリーは異なる今)が、それはこの挑戦のために魔法のように動作し、私は抵抗することができませんでした。

使い方

RÆN²‘İḤCP  Main link. Argument: n

R          Range; yield [1, ..., n].
 ÆN        Compute the kth primes for each k in that range.
   ²‘      Square and increment each prime p.
     İ     Invert; turn p² + 1 into the fraction 1 / (p² + 1).
      Ḥ    Double; yield 2 / (p² + 1).
       C   Complement; yield 1 - 2 / (p² + 1).
        P  Product; multiply all generated differences.

あるÆNだけM-特定事業者?また、Melly
CalculatorFeline

これらの演算子はいずれもMに固有のものではありません。違いは、Mが分数を計算し、Jellyが浮動小数点数を計算することです。
デニス

9

Mathematica、32バイト

1##&@@(1-2/(Prime@Range@#^2+1))&

整数入力を受け取り、実際の小数部を返す名前のない関数。

これは、という事実を使用しています。Mathematicaはリスト上のすべての基本的な算術演算をスレッド化するという事実のおかげで、コードはゴルフのようになります。したがって、まずlistを作成し、次にそれらすべての素数を取得し、そのリストを上記の式にプラグインします。これにより、すべての要因のリストが得られます。最後に、リストに適用してすべてを乗算します。これはにゴルフできます。(p2-1)/(p2+1) = 1-2/(p2+1){1, 2, ..., n}Times1##&

または、Array同じバイトカウントに使用できます。

1##&@@(1-2/(Prime~Array~#^2+1))&

1-2= 1、そうですか?
電卓

@CatsAreFluffyうん(-1実際)、しかし1-2/x ≠ -1/x。;)
マーティンエンダー

@Range@±~Array~
電卓

6

Python 2、106バイト

from fractions import*
n=input()
F=k=P=1
while n:b=P%k>0;n-=b;F*=1-Fraction(2*b,k*k+1);P*=k*k;k+=1
print F

1行目と4行目は非常に痛いです... が存在するPython 3.5+でさえ、Fractionを使用して個別に乗算して使用するよりも優れていることがgcdわかりgcdましたmath

総理世代は、@ XNORの答えから適応ここウィルソンの定理を使用しています、。


5

ルビー、 122 77 65バイト

10バイトを削ってくれたSherlockに感謝します。

require'prime'
->n{Prime.take(n).map{|x|1-2r/(x*x+1)}.reduce(:*)}

数値を受け取り、を返す匿名関数を定義しますRational


4

PARI / GP、33バイト

n->prod(i=1,n,1-2/(prime(i)^2+1))

代替バージョン(46バイト):

n->t=1;forprime(p=2,prime(n),t*=1-2/(p^2+1));t

浮動小数点(t_REAL)結果(38バイト)を提供する非競合バージョン:

n->prodeuler(p=2,prime(n),1-2/(p^2+1))


4

Pyth、 26 25

/RiFN=N*MCm,tdhd^R2.fP_ZQ

ここで試してみるか、テストスイートを実行してください

ジャクベのおかげで1バイト節約!

仕様のかなり単純な実装。P<neg>負の数の正の値が素数であるかどうかを返す、洗練された「新しい」(これがいつ追加されたのかわかりませんが、これまで見たことがありません)を使用します。マッピングなどのいくつかは、おそらくゴルフすることができます...


3

ジュリア、59 42バイト

n->prod(1-big(2).//-~primes(2n^2)[1:n].^2)

これは、整数を受け入れ、分子と分母Rationalでを返す無名関数ですBigInt

2 n 2未満の素数のリストを生成し、最初のn個の要素を選択することから始めます。これは、n番目の素数がすべてのn > 1 に対して常にn 2より小さいために機能します(こちらを参照)。

選択したn個の素数の各pについて、要素ごとのべき乗()を使用してpを2乗し、十分な精度を確保するために2を最初にa に変換する有理2 /(p + 1)を構築します。これを1から減算し、結果の有理数配列の積を取り、結果の有理数を返します。.^2BigInt

使用例:

julia> f = n->prod(1-big(2).//-~primes(2n^2)[1:n].^2)
(anonymous function)

julia> f(15)
4506715396450638759507001344//11179755611058498955501765625

Sp3000のおかげで17を節約できました!


2

凸、28バイト

Convexは、CJamとGolfscriptに大きく基づいた、私が開発している新しい言語です。インタープリターとIDEはここにあります。入力は、コマンドライン引数への整数です。インデックスは1ベースです。CP-1252エンコードを使用します。

,:)_{µ²1-}%×\{µ²1+}%×¶_:Ðf/p

チャレンジが投稿される前にこのプログラムが使用するいくつかの機能に取り組んでいましたが、このチャレンジが出てからコミットが行われたため、この答えは競合していると考えるかもしれません。


2

MATL、18バイト

:Yq2^tqpwQpZd1Mhw/

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

2^52内部で正確に表現できるのは整数までであるため、大きな入力では失敗します。

説明

:     % implicitly take input n. Generate range [1,...,n]
Yq    % first n prime numbers
2^    % square
tqp   % duplicate. Subtract 1. Product
wQp   % swap. Add 1. Product
Zd    % gcd of both products
1M    % push the two products again
h     % concatenate horizontally
w/    % swap. Divide by previously computed gcd. Implicitly display

2

Mathematica、45バイト

Times@@Array[(Prime@#^2-1)/(Prime@#^2+1)&,#]&

プライム?分数?Mathematica。


1

Haskell、53バイト

匿名関数、53文字:

(scanl(*)1[1-2%(p*p+1)|p<-nubBy(((>1).).gcd)[2..]]!!)

ここで試してください(注:標準のGHCiでは、最初に確認Data.RatioData.Listてインポートする必要があります)。

λ (scanl(*)1[1-2%(p*p+1)|p<-nubBy(((>1).).gcd)[2..]]!!) 5
41472 % 99125
:: Integral a => Ratio a

Haskellのリストインデックス!!は0ベースです。(___!!)は匿名の関数を形成するようなオペレータセクションです(xs !!) n == xs !! n

シーケンス全体を生成するのに4バイト少なくなります。

λ mapM_ print $ take 10 $     -- just for a nicer output
    scanl(*)1[1-2%(n*n+1)|n<-[2..],all((>0).rem n)[2..n-1]]
1 % 1
3 % 5
12 % 25
144 % 325
3456 % 8125
41472 % 99125
3483648 % 8425625
501645312 % 1221715625
18059231232 % 44226105625
4767637045248 % 11719917990625
:: IO ()

0

真剣に、25バイト

,r`PªD;⌐k`M┬`π`Mi│g;)@\)\

出力a\nb\n改行です)。プライム生成はかなり遅いため、大きな入力には長い時間がかかります(また、メモリ不足のために失敗する可能性があります)。

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

説明:

,r`PªD;⌐k`M┬`π`Mi│g;)@\)\
,r                         push range(input)
  `PªD;⌐k`M                map:
   P                         k'th prime
    ª                        square
     D                       decrement
      ;                      dupe
       ⌐                     add 2 (results in P_k + 1)
        k                    push to list
           ┬               transpose
            `π`M           map product
                i│         flatten, duplicate stack
                  g;)      push two copies of gcd, move one to bottom of stack
                     @\    reduce denominator
                       )\  reduce numerator

タイトルは陽気に見えます。私はそれを「マジで、25バイト?!」と読んだ
cdt

@AlexKChen私が言語を作成してからほぼ2年が経ちましたが、今では報われました:)
Mego
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.