私はピライ素数ですか?


14

A Pillaiさん素数が素数であるpいくつかの肯定が存在するためmそのような(m!+1)0(mod p)p1(mod m)

換言すれば、整数、それがある場合Pillaiさんの素数である素数別の正の整数が存在する場合、ような階乗の、プラスで割り切れる及び場合で割り切れない。pmm1pp1m


入力として正の整数を指定し、それがピライ素数であるかどうかを判断します。ピライ素数の配列はOEIS A063980です。

たとえば、はピライ素数です。23

  • これは素数であり、2つの要素しかありません。
  • m=14およびは上記の条件を満たす:およびは分割しない。およびはも分割しません。23 14 + 1 14 22 23 18 + 1 18 22m=1823(14!+1)142223(18!+1)1822

テストケース

真実:

23
59
83
109
139
593

偽物:

5
7
8
73
89
263
437

真実の場合、それぞれのm[(23, [14, 18]), (59, [15, 40, 43]), (83, [13, 36, 69]), (109, [86]), (139, [16]), (593, [274])]です。


標準の出力形式(つまり、真偽/偽の値)に従うかまたはPillai素数に一貫性のある値を設定し、そうでない場合は一貫性のない値を設定するか、その逆を行うことができます。

デフォルトではこれらの抜け穴が禁止されていることに注意しながら、任意のプログラミング言語で競争し、標準的な方法で入力を取得し、出力を提供できます。これはであるため、すべての言語の最短の送信(バイト単位)が優先されます。


入力は合成整数にできますか?
ジョンファンミン

@JungHwanMinはい、入力は合成整数にすることができます。
氏Xcoder

437のようなテストケースをお勧めします。テストケースは複合ですが、18!+1に分割されます。
ニトロドン

@Nitrodonそのテストケースを追加しました、ありがとう!
氏Xcoder

1
@DanielIndieどうぞ[(23, 14), (23, 18), (59, 15), (59, 40), (59, 43), (83, 13), (83, 36), (83, 69), (109, 86), (139, 16), (593, 274)]。また、チャレンジに追加しました。
Mr Xcoder

回答:


9

パイソン2115の 111 110 109バイト

Mr. Xcoderのおかげで-6バイト

lambda n:n>2and cmp(*map(all,zip(*[[n%x==1or~f(x)%n,n%x]for x in range(2,n)])))<0
f=lambda x:0**x or x*f(x-1)

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

関数は、「Pillai条件」を満たさない~-n%x<1or~f(x)%n>0かどうかを検証する2つの部分で構成され、主要な検証を行います。 それが両方のアイテムに適用された後、有効な「ピライ番号」ある場合、最初のアイテムは/ を含み、2番目はプライムである場合/ を含みます。 これらは、このシナリオで返されることに渡されます(有効なピライプライムです)。他の組み合わせが返されるか、n n%x>0
allFalse0True1n
cmp-1[[0, 0], [1, 0], [1, 1]]01


2
+1、巧妙なアルゴリズム(およびその説明)がこのSEが大好きな理由です
IanF1

8

ゼリー11 8バイト

Ṗ!%ẹ’ḍ’E

ピライ素数の場合は0、それ以外の場合は1を返します。

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

使い方

Ṗ!%ẹ’ḍ’E  Main link. Argument: n

Ṗ         Pop; yield [1, ..., n-1].
 !        Take the factorial of each integer.
  %       Take the factorials modulo p.
   ẹ’     Find all indices of n-1.
     ḍ’   Test n-1 for divisibility by each of these indices.
       E  Return 1 if all of the resulting Booleans are equal (all 1 means there is
          no suitable m, all 0 means n is not prime), 0 if they are different.

1
それは私がそれをやっただろうおおよその方法ですが、私はm∈[1、n)であることを証明することができませんでした。
エリックアウトゴルファー

4
もしメートル≥nは、その後、M!nで割り切れるので、m!+ 1≡1(mod n)
デニス



3

J30 26バイト

FrownyFrogのおかげで-4バイト

1 e.i.((|1+!)~<1~:|)1&p:*]

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

説明:

                        1&p:*]      checks if the number is prime and if not sets it to 0
                   1~:|             checks if p is not 1 mod m
           (|1+!)~                  m factorial plus 1 modulo n
                  <                 are both conditions met?  
       i.                           generates successive m's (a list 0..n-1)
   1 e.                             1's are at the indices of m, so if there's 1 - Pillai

1
モジュロnが1~:|2バイトを保存するよりも小さいことを確認してください。
FrownyFrog

1
(]|1+!@[)ちょうど(|1+!)~
FrownyFrog

@FrownyFrog-ありがとう!私は考えていた~、それはあなたの前のコメントで意味があります。
ガレンイワノフ


2

パイソン2109の 107バイト

lambda p:any(~-p%m>~l(m)%p<1for m in range(2,p))*all(p%i for i in range(2,p-1))
l=lambda a:0**a or a*l(a-1)

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


説明

lしたがって、渡された数の階乗見つけ5入力リターンとして120

all(p%i for i in range(2,p-1))当社の他の条件はすでにこれらのアウトを原則として数が素数であるかどうかをチェックし、我々は0と1を無視します。

最後に、any(~-p%m>-~l(m)%p==0for m in range(2,p))すべての潜在的なmを反復処理して、ニーズを満たすかどうかを確認します。~-pを意味しp+1ます。次に、それが-~l(m)%p(に変換される(m!-1)%p)より大きいかどうかを確認し、比較し0ます。基本的に~-p%mは0より大きく、0で-~l(m)%pなければなりません。


ソース


改善点


2

おそらくtioリンクで見ることができるように、すべてのケースがパスするわけではありません。それは、jsが大きな数を処理できないためです。

F%n>n-2&(F+1)%n<1(F+1)%n<1検知を防ぐための二重チェックがあります(しかし、jsの大きな数の問題では逆ではありません。ソリューションのバイトカウントを60に減らすために、より小さい数が本当に必要です。

JavaScript(Node.js)90 88 86 72 68バイト

  • 1バイト削減したArnauldに感謝
f=(n,F=i=2,g=0)=>n%i?f(n,F*=++i,g|=F%n>n-2&(F+1)%n<1&~-n%i>0):i==n*g

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


2

Brachylog、13バイト

>.ḟ+₁ḋ∋?-₁f≡ⁿ

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

Pillai素数に成功し、出力変数を通じて最小のmを提供し、それ以外の場合は失敗します。これがsundarのソリューションでバイトを節約する方法の大部分は、かなり大きな数の素因数分解を繰り返し計算することなので、大きな入力では非常に遅くなります。(ラップトップの電源が切れたら、おそらくローカルのBrachylogインストールでこれらのケースを実行します。)

 .               The output
>                is less than the input,
       ?         the input
      ∋          is an element of
     ḋ           the prime factorization of
 .               the output's
  ḟ              factorial
   +₁            plus one,
           ≡ⁿ    and the output is not an element of
          f      the list of all factors of
       ?         the input
        -₁       minus one.

1

[Perl]、45バイト

use ntheory":all";is_prime($n)&&is_pillai($n)

数論モジュールには、組み込み関数として述部があります(is_pillaiは、実際には0または最小のmを返すため、A063828も解決します)。基礎となるCおよびPerlコードは(もちろん)ゴルフされていません。Cコードは次のようになります。

UV pillai_v(UV n) {
  UV v, fac = 5040 % n;
  if (n == 0) return 0;
  for (v = 8; v < n-1 && fac != 0; v++) {
    fac = (n < HALF_WORD) ? (fac*v) % n : mulmod(fac,v,n);
    if (fac == n-1 && (n % v) != 1)
      return v;
  }
  return 0;
}

(一般的にUVをuint64_tまたは同様のものに置き換え、HALF_WORDはmulmodを単純なネイティブopに最適化できるかどうかを決定します)。

純粋なPerlコードは次のようになります。

sub is_pillai {
  my $p = shift;
  return 0 if $p <= 2;
  my($pm1, $nfac) = ($p-1, 5040 % $p);
  for (my $n = 8; $n < $p; $n++) {
    $nfac = mulmod($nfac, $n, $p);
    return $n if $nfac == $pm1 && ($p % $n) != 1;
  }
  0;
}


1

ささやきv2、230バイト

> 1
> Input
>> 1…2
>> L!
>> L+1
>> L∣2
>> L⋅R
>> 2%L
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
> {0}
>> 12∖13
>> Each 8 14
>> L≠1
>> Each 16 15
>> Each 7 17 15
>> 18∖13
>> [19]
>> 2’
>> 21⋅20
>> Output 22

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

これは、非ピライ素数の場合は空のリストを返し、そうでない場合は空でないリストを返します。

使い方

Whispersは実数/複素数の操作用に設計されており、適切な測定のために少しの配列コマンドが追加されていEachます。

Whispersの背景:

ささやきは、他のほとんどの言語への実行パスがわずかに異なります。各行を直線的に処理するのではなく、条件で分岐するだけで、Whispersはファイルの最後の行から始まります>(ルールはそれよりもやや複雑ですが、今のところ知っておく必要があることはすべてです)、および数字の意味行が>またはで始まるかどうかによって異なります>>

または>などの行で始まる場合、これは定数行です。毎回同じ値を返します。ここで、数値は数値形式を表しているため、最初の行は呼び出されると常に1を返します。> 1> Input

>>ただし、行が始まる場合、数値は他の行への参照として扱われます。たとえば、行では>> 1…2、これは整数1および2に対してコマンドを実行するのではなく、行1および2から返された値に対してコマンドを実行します。この場合、これらの値は整数1であり、入力として渡される整数です。

この例では、23の入力を考えてみましょう。Whispersの前処理により、2行目(> Input)がに変換されることに注意してください> 23

最初のコマンドは3行目です>> 1…2ダイアディック範囲はこの場合にも、1に対して23生じ、{1、2、... 22、23} 。次に、9行目から12行目までスキップします。

>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3

ここには4つの連続したEachステートメントがあり、それぞれが前の結果を反復し、基本的に4行のコマンドを配列3行の範囲にマッピングします。最初の3つのステートメントは線で、シンプルなマップである456

>> L!
>> L+1
>> L∣2

これらの三つの整数を超えるコマンド、nは、利回り(nは!+1)|x、どこ階乗を表し、除数を表し、xは入力です。最後に、12行目はダイアディックマップ構造です。

二項地図他のラインにターゲット、左右、各インデックス:構造は、次の3つの整数を取ります。ここでは、左と右を圧縮してペアのリストを作成し、dyadicコマンド(ターゲット)によって各ペアを減らします。ここで、入力が23の場合、リストは{1、2、... 22、23}および{0、0、... 1、0}であり、コマンドは

>> L⋅R

左の引数に右の引数を掛けます。これにより、整数の配列が生成されます。0が増加した階乗が入力で割り切れない整数のインデックスと、元のインデックスが存在するインデックスで0になります。この配列をAと呼びます。次に、{0}Aのセットの差を取ることにより、Aから0を削除します

> {0}
>> 12∖13

入力例では、これにより集合{14、18、22}が生成されます。次に、セットの各値で除算される入力の残りを取得し、その残りが1に等しくないかどうかを確認します。

>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15

ここでも、我々は、いずれかのリスト持って0または1秒および除去する必要0秒と置き換える1元の値に秒。ここで、上で見たコードを繰り返しますが、>> 18∖13ではなく12。最後に、この結果セットを最終チェック用のリストにキャストします。残念ながら、コードは、これらのすべての基準(437など)を達成する合成数も拒否する必要があります。そこで、最終チェックを追加し、最終リストに入力の素数を掛けます。Python乗算がリストでどのように機能するかにより、0は空のリストに置き換えられ、1は効果がありません。したがって、入力の素数を計算し、それにmのリストを掛けますsを入力し、最終結果を出力します。

>> 2’
>> 21⋅20
>> Output 22

0

APL(NARS)、65文字、130バイト

{∼0π⍵:0⋄m←⎕ct⋄⎕ct←0⋄r←⍬≢a/⍨{0≠⍵∣p}¨a←k/⍨0=⍵∣1+!k←⍳p←¯1+⍵⋄⎕ct←m⋄r}

ここで23xは23r1を意味するため、分数23/1です。テスト:

  f←{∼0π⍵:0⋄m←⎕ct⋄⎕ct←0⋄r←⍬≢a/⍨{0≠⍵∣p}¨a←k/⍨0=⍵∣1+!k←⍳p←¯1+⍵⋄⎕ct←m⋄r}
  f¨23x 59x 83x 109x 139x 593x
1 1 1 1 1 1 
  f¨5x 7x 73x 89x 263x 437x
0 0 0 0 0 0 

0

C#(Visual C#Interactive Compiler)、138 + 22 = 160バイト

n=>Enumerable.Range(2,n-2).All(x=>n%x>0)&Enumerable.Range(1,n).Any(x=>{BigInteger a,b=1;for(a=1;a<=x;a++)b*=a;return(b+1)%n<1&(n-1)%x>0;})

TIOは、MonoのリリースではSystem.Numericsライブラリを実装していないため、結果を確認するにはオンラインで試してみてください! 代わりにここに。

説明:

using System.Numerics; //necessary to handle large numbers created by the factorials

return 
    Enumerable.Range(2,n-2).All(x=>n%x>0)       // is prime
    &
    Enumerable.Range(1,n).Any(x=>
    {
        BigInteger a,b=1;for(a=1;a<=x;a++)b*=a; //b = a!
        return (b+1)%n<1
               &                                //the condition for PPs
               (n-1)%x>0;             
    });

0

CJam、37バイト

ri_mp\[_{_M)m!)@%!\_M)%1=!@&\}fM]);:|

11入力がピライ素数の場合に出力、それ以外の場合0001または10

説明:

                                         e# Explanation | Stack
ri_mp\[_{_M)m!)@%!\_M)%1=!@&\}fM]);:|    e# Whole code | Example input: 593
ri                                       e# Read input as integer | 593
  _                                      e# Duplicate | 593 593
   mp                                    e# Is it prime? | 593 1
     \                                   e# Swap top two stack elements | 1 593
      [                         ]        e# Delimits an array. Any operations that
                                         e# push a value are placed into the array
       _                                 e# Duplicate | 1 593 [593]
        {                    }fM         e# A for loop from 0 to (n-1) looped through
                                         e# variable M
         _                               e# Duplicate top stack value | ...[593 593]
          M)                             e# Get M+1, as if we try M=0 we get an error
                                         e# | ...[593 593 1]
            m!                           e# Factorial | ...[593 593 1]
              )                          e# Add one | ...[593 593 2]
               @                         e# Rotate stack | ...[593 2 593]
                %                        e# Modulus | ...[593 2]
                 !                       e# Equal to 0? | ...[593 0]
                  \_                     e# Swap and duplicate | ...[0 593 593]
                    M)                   e# Push M+1 | ...[0 593 593 1]
                      %                  e# Modulus | ...[0 593 0]
                       1=!               e# Not equal to 1? | ...[0 593 1]
                          @              e# Rotate | ...[593 1 0]
                           &             e# AND | ...[593 0]
                            \            e# Swap | ...[0 593]
                             }     
                                ]
                                 );      e# Dump and discard last element
                                         e# | 1 593 [...]
                                   :|    e# Flatten array with OR | 1 1
                                         e# Implicit output

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

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