到達可能な番号


14

定義

  • オイラーファイ関数aka totient function):正の数を取り、特定の数と互いに素である特定の数より小さい正の数を返す関数。として示されφ(n)ます。

  • 到達番号:正の整数が存在する場合x、その結果をφ(x) == n、その後n到達可能

仕事

与えられた正の整数が到達可能かどうかを判断する関数/プログラムを作成します。

入力

妥当な形式の正数。数は言語の能力の範囲内であると想定できます。単項入力が受け入れられます。

出力

到達可能な数値用と到達不能な数値用の2つの一貫した値。2つの値は、一貫している限り、何でもかまいません。

テストケース

以下の到達可能な番号100は次のとおりです。

1、2、4、6、8、10、12、16、18、20、22、24、28、30、32、36、40、42、44、46、48、52、54、56、58、 60、64、66、70、72、78、80、82、84、88、92、96

(OEISのA002202

ルール

標準の抜け穴が適用されます。

勝利基準

これはです。最も少ないバイト数での送信が優先されます。

参照資料



1
1行のRetina回答に賞金を提供します。1行は単純な正規表現(バックティックなし)です。
リーキー修道女

@LeakyNun私は少し混乱していphi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }ますが、これまでのところ..それは本当ですか?
Khaled.K

@ Khaled.Kはい、それは本当です。
リーキー修道女

回答:


6

ゼリー7 6バイト

²RÆṪe@

正確ではありません。1または0を返します。

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

使い方

²RÆṪe@  Main link. Argument: n

²       Square; yield n².
 R      Range; yield [1, ..., n²].
  ÆṪ    Compute the totient of each integer in the range.
    e@  Exists swap; test if n occurs in the generated array.

どのように機能しますか?
リーキー修道女

1
強引な。totient関数には下限があるため、十分な範囲を取り、totientをマップし、入力の発生をチェックするだけで十分です。
デニス

平方根が最小であることを証明できますか?
漏れの修道女

平方根は実際には下限ではありませんが、平方根をsqrt(2)で除算すると下限になります。倍増は必要ないことは確かですが、寝るまで証拠を待つ必要があります。あまりにも疲れています。
デニス

4
@LeakyNun実際、この論文の補題3 は、n = 2kと奇数kがなければ平方根が下限であることを証明しています。以来、Kおよび2K同じトーティエントを有する、倍加が必要とされません。
デニス

6

Mathematica、28バイト

EulerPhi@Range[#^2]~FreeQ~#&

デニスのゼリーの答えのように、入力の2乗までのすべての数値のφ値を計算し、入力がそこに現れるかどうかを確認します。False入力が到達可能かどうかを返しますTrue。うん、それは紛らわしいです。しかしFreeQ、バイトよりも短いバイトMatchQであり、ちょっと、仕様は任意の2つの一貫した値を言った> :)


2

JavaScript(ES6)、90 82バイト

0またはを返しますtrue

f=(n,x=n*2)=>x?(p=i=>(c=(a,b)=>a?c(b%a,a):b<2)(i,x)+(i&&p(--i)))(x)==n||f(n,x-1):0

これがあればという前提に基づいており、xが存在する、その後≤2Nをxは。間違っていることが判明した場合は、これx=n*nx=n*2(同じサイズ、はるかに遅い)の代わりに使用するように更新する必要があります。

エッジケースはn = 128で、 which (255)を計算する必要があります。

デモ


便利なフェルマー素数は、連続したエッジケースにすべての連続した寄付上昇しているn=2n=8n=128n=32768n=2147483648
ニール

1

公理、56バイト

f(x:PI):Boolean==member?(x,[eulerPhi(i)for i in 1..2*x])

私はそれが正しいかどうかわからない...テストコードと結果

(35) -> [i  for i in 1..100|f(i)]
   (35)
   [1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46,
    48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96, 100]

範囲1 ..(2 * x)は、入力x = 500 ...まで問題ありません。




0

05AB1E13 12バイト

編集:スタックに十分な要素がない場合、入力が再利用されるため、バイトを保存しました。

到達可能な場合は1、到達できない場合は0を出力します。

x≤2nが存在する場合の仮定に依存します。

xGNÕQi1,q}}0

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

使い方

              # implicit input    
x            # push input, 2 * input
 G           # for N in 1..2*input
             # implicit push input
  N          # push N
   Õ         # push totient of N
    Q        # check if both are equal
     i.      # if equal
      1,     # print 1
        q    # quit program
         }   # end if
          }  # end for
           0 # push 0 if condition never reached
             # implicit print

0

C、123バイト

g(a,b){return!a?b:g(b%a,a);}
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

オンラインで試す

#include <stdio.h>

// gcd function
g(a,b){return!a?b:g(b%a,a);}

// Euler phi(x) function
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}

// check if m is reachable, phi(x) for x in (m , m^2]
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

main()
{
    // print all reachable number below 50
    for(int x=1; x<50; x++)
    {
        s(x);

        if(t)
        {
            printf(" %d ~ phi(%d) \n", x, k);
        }
    }
}

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