Ben 'Redivosite' Numarası mıyım?


26

Redivosite, bu zorluğun tek amacı için icat edilmiş bir portmanteau kelimesidir. Azaltma, Bölme ve Kompozit karışımı.

Tanım

N> 6 olan bir tamsayı verildi :

  • Eğer N asal olduğunu, N bir Redivosite Numarası değildir.
  • Eğer N kompozit:
    • art arda N '= N / d + d + 1 ' i N ' asal olana kadar hesaplayın , burada d , 1'den büyük N'nin en küçük bölenidir.
    • K ve nihai değer yalnızca eğer bir Redivosite sayısı N' bir bölen bir N

Aşağıda 100 ilk Redivosite Numarası bulunmaktadır (kayıt sırasında OEIS girişi yok):

14,42,44,49,66,70,143,153,168,169,176,195,204,260,287,294,322,350,414,462,518,553,572,575,592,629,651,702,726,735,775,806,850,869,889,891,913,950,1014,1023,1027,1071,1118,1173,1177,1197,1221,1235,1254,1260,1302,1364,1403,1430,1441,1554,1598,1610,1615,1628,1650,1673,1683,1687,1690,1703,1710,1736,1771,1840,1957,1974,2046,2067,2139,2196,2231,2254,2257,2288,2310,2318,2353,2392,2409,2432,2480,2522,2544,2635,2640,2650,2652,2684,2717,2758,2760,2784,2822,2835

Örnekler

  • N = 13 : 13 asal olduğundan, 13 bir Redivosite Numarası değildir
  • N = 32 : 32/2 + 3 = 19; 19, bir bölen ya da 32 değildir, bu nedenle 32, Yeniden Numaralı bir Sayı değildir.
  • N = 260 : 260/2 + 3 = 133, 133/7 + 8 = 27, 27/3 + 4 = 13; 13 bir bölen veya 260, yani 260 bir Redivosite Numarasıdır

Senin görevin

  • Tamsayı N verildiğinde , bir Redivosite Numarası veya aksi takdirde sahte bir değerse, gerçek bir değer döndürün. (Tutarlı oldukları sürece her iki farklı değeri de çıktırabilirsiniz.)
  • Girişin 6'dan büyük olması garanti edilir .
  • Bu , yani bayt cinsinden en kısa cevap kazanır!

13
Gerçekten sadece belirli bir özelliğe sahip sayı dizileri olan tüm bu "sayı dizisi" zorluklarının karar sorunları olarak sorulmasını diliyorum. Bunları doğrudan üretmenin bir yolu olmadığından şüpheliyim, bu yüzden olası tek çözüm karar sorununu çözmek ve sonra Nth'i ya da ilk N'yi ya da bu özelliği sağlayan tüm tam sayıları bulan bir döngüye sarmak.
Martin Ender,

3
Genel olarak karar problemi olmayan sıralama zorluklarını severim , ancak bunun için karar probleminin daha uygun olacağını düşünüyorum. Ben hiçbir ilişkisi bkz arasındaki yazdırmak böyle terimler n th veya birinci n belki alarak izin akıllı bir şekilde n girdi olarak ve öyle olmadığını kontrol redivosite ?
Bay Xcoder

1
@MartinEnder & Mr.Xcoder Bu benim ilk niyetimdi (dolayısıyla sadece geri aldığım orijinal başlık) ve fikrimi değiştirdim. Bunun herhangi bir WIP çözümünü mahvetmemesi gerektiğini düşünüyorum (söylediğiniz nedenlerden dolayı), bu yüzden düzenlemiştim.
Arnauld

5
@ Mr.Xcoder Evet, demek istediğim buydu. Bir dizi olarak gerçekten anlamlı olan dizi zorluklarını umursamıyorum (ya a(n)doğrudan hesaplayabileceğinizden ya da önceki terimlerden bir terim hesaplayabileceğinizden dolayı). Arnauld, mücadeleyi değiştirdiğin için teşekkürler. :)
Martin Ender,

Yanıtlar:


9

Haskell, 91 85 83 80 75 74 bayt

n#m=([n#(div m d+d+1)|d<-[2..m-1],mod m d<1]++[mod n m<1&&m<n])!!0
f x=x#x

Çevrimiçi deneyin!

f x=x#x                           -- call # with x for both parameters
n#m               
         |d<-[2..m-1],mod m d<1   -- for all divisors d of m
    [n#(div m d+d+1)           ]  -- make a list of recursive calls to #,
                                  -- but with m set to m/d+d+1
   ++ [mod n m<1&&m<n]            -- append the Redivosite-ness of n (m divides n,
                                  -- but is not equal to n)
                           !!0    -- pick the last element of the list
                                  -- -> if there's no d, i.e. m is prime, the
                                  --    Redivosite value is picked, else the
                                  --    result of the call to # with the smallest d

Düzenleme: @BMO sayesinde -2 bayt, @ H.PWiz sayesinde -3 bayt ve @ Ørjan Johansen sayesinde -5 -6 bayt sayesinde



Aslında, 74
Ørjan Johansen

@ ØrjanJohansen: Tekrar teşekkürler.
nimi


6

C (gcc) , 94 89 bayt

m,n;o(k){for(m=1;m++<k;)if(k%m<1)return m;}
F(N){for(n=N;m=o(n),m-n;n=n/m-~m);N=m<N>N%n;}

Çevrimiçi deneyin!

açıklama

m,n;                  // two global integers
o(k){                 // determine k's smallest divisor
 for(m=1;m++<k;)      // loop through integers 2 to n (inclusive)
  if(k%m<1)return m;} // return found divisor
F(N){                 // determine N's redivosity
 for(n=N;             // save N's initial value
  m=o(n),             // calculate n's smallest divisor (no name clash regarding m)
  m-n;                // loop while o(n)!=n, meaning n is not prime
                      //  (if N was prime, the loop will never be entered)
  n=n/m-~m);          // redivosite procedure, empty loop body
 N=m<N>N%n;}          // m<N evaluates to 0 or 1 depending on N being prime,
                      //  N%n==0 determines whether or not N is divisible by n,
                      //  meaning N could be redivosite => m<N&&N%n==0
                      //  <=> m<N&&N%n<1 <=> m<N&&1>N%n <=> (m<N)>N%n <=> m<N>N%n

4

Jöle , 14 bayt

ÆḌḊ
Ç.ịS‘µÇ¿eÇ

Çevrimiçi deneyin!

Nasıl çalışır

ÆḌḊ         Helper link. Argument: k

ÆḌ          Yield k's proper (including 1, but not k) divisors.
  Ḋ         Dequeue; remove the first element (1).


Ç.ịS‘µÇ¿eÇ  Main link. Argument: n

     µ      Combine the links to the left into a chain.
      Ç¿    While the helper link, called with argument n, returns a truthy result,
            i.e., while n is composite, call the chain to the left and update n.
Ç             Call the helper link.
 .ị           At-index 0.5; return the elements at indices 0 (last) and 1 (first).
              This yields [n/d, d].
   S          Take the sum.
    ‘         Increment.
        Ç   Call the helper link on the original value of n.
       e    Test if the result of the while loop belongs to the proper divisors.

4

Python 2 , 97 91 bayt

r=0;e=d=i=input()
while r-e:e=i;r=[j for j in range(2,i+1)if i%j<1][0];i=i/r-~r
d%e<1<d/e<q

Çevrimiçi deneyin!

Çıkış kodu ile çıkış yapar.

Ungolfed:

r = 0                             # r is the lowest divisor of the current number,
                                  # initialized to 0 for the while loop condition.
e = d = i = input()               # d remains unchanged, e is the current number
                                  # and i is the next number.
while r != e:                     # If the number is equal to its lowest divisor,
                                  # it is prime and we need to end the loop.
    e = i                         # current number := next number
    r = [j for j in range(2, i+1) # List all divisors of the number in the range [2; number + 1)
         if i%j < 1][0]           # and take the first (lowest) one.
    i = i/r+r+1                   # Calculate the next number.
                                  # We now arrived at a prime number.
print d%e == 0 and d != e         # Print True if our current number divides the input
                                  # and is distinct from the input.
                                  # If our current number is equal to the input,
                                  # the input is prime.

Çevrimiçi deneyin!


3

05AB1E , 17 16 bayt

[Dp#Òć©sP+>]Ö®p*

Çevrimiçi deneyin!

açıklama

[                  # start loop
 Dp#               # break if current value is prime
    Ò              # get prime factors of current value
     ć©            # extract the smallest (d) and store a copy in register
       sP          # take the product of the rest of the factors
         +>        # add the smallest (d) and increment
           ]       # end loop
            Ö      # check if the input is divisible by the resulting prime
             ®p    # check if the last (d) is prime (true for all composite input)
               *   # multiply

2

Pyth , 20 bayt

<P_QiI.WtPHh+/ZKhPZK

Burada dene!

Nasıl çalışır

iI.WtPHh + / ZKhPZK || Tam program

  .W || İşlevsel iken. A ve B argümanları olarak iki işlevi alır.
                 || A (değer) gerçeğe yakın olsa da, değeri B (değer) konumuna getirin. 
                 || başlangıç ​​değeri giriştir.
    tPH || İlk işlev, A. Tek bir argüman alır, H.
     PH || .. H'nin ana faktörleri faktörler
    t || .. Kuyruk (ilk elemanı çıkarın). Truthy (H kompozit) iken:
       h + / ZKhPZK || İkinci fonksiyon, B. tek bir argüman alır, Z:
         / Z || .. Z'yi bölün:
           KhP || .. En düşük asal çarpan ve onu K'ya atayın.   
       h || .. Artırma.
        + K || Ve K ekle
iI || Sonucun (son değer) girişi böldüğünü kontrol edin.

Ve ilk 4 byte ( <P_Q) sadece girişin asal olup olmadığını kontrol eder.

Emigna'nın yardımıyla 3 bayt kurtarmayı başardım.


Parça head(P)yerine benzer bir şey kullanabilir misiniz? fiITZ21'den büyük en küçük bölen her zaman birinci sınıf olacaktır?
Emigna

@Emigna Ninja'd, sabit ve teşekkürler!
Bay Xcoder,

2

Python 3 , 149 bayt

def f(N):
	n=N;s=[0]*-~N
	for p in range(2,N):
		if s[p]<1:
			for q in range(p*p,N+1,p):s[q]=s[q]or p
	while s[n]:n=n//s[n]-~s[n]
	return s[N]>1>N%n

Çevrimiçi deneyin!

Elek yaklaşımı kullanarak. Hızlı olmalı ( O(N log log N)= Eratosthenes elekinin zaman karmaşıklığı) büyük olsa bile N(ancak O(N)tamsayıları bellekte saklar )

Not:

  • Tüm ara değerler ispat edilebilir naşmayan Nve için N > 7 polabilir range(2,N)yerine range(2,N+1)eleme için.
  • /çalışmıyor //, liste dizini nedeniyle kullanılmalı.
  • rangeMaalesef başka bir değişkende saklamak yardımcı olmuyor.

Açıklama:

  • -~N== N+1.
  • İlk başta, dizi sıfırlarla sbaşlatılır N+1(Python 0-indexing, yani endeksler 0..N)
  • Başlangıç işlemlerinden sonra s[n]olması bekleniyor 0eğer nbir asal olduğunu ve piçin pböler asgari asal neğer nbir bileşimidir. s[0]ve s[1]değerler önemli değildir.
  • pMenzildeki her biri için [2 .. N-1]:

    • Eğer s[p] < 1(yani, s[p] == 0), sonra p, bir asal olup her biri için qbir çoklu varlık pve s[q] == 0, atama s[q] = p.
  • Son iki satır basit, bunun dışında n//s[n]-~s[n]== (n // s[n]) + s[n] + 1.


Python 3 , 118 bayt

def f(N):
	n=N;s=[0]*-~N
	for p in range(N,1,-1):s[2*p::p]=(N-p)//p*[p]
	while s[n]:n=n//s[n]-~s[n]
	return s[N]>1>N%n

Çevrimiçi deneyin!

Biraz daha kötü performans pahasına. (Bu bir O(N log N)zaman karmaşıklığında çalışır , Python dilimlerinin makul şekilde uygulandığını varsayar)


Eşdeğer tam program 117 bayttır .


149 bayt n//s[n]-~s[n]yerine kullanabilirsiniz n//s[n]+s[n]+1.
Bay Xcoder

@ Mr.Xcoder Teşekkürler!
user202729

Ayrıca bence or polabilir|p
Bay Xcoder

@ Mr.Xcoder Hayır, or pmantıksal veya |pbitsel olarak gerçekleştirirken veya. Bu, a or böyle b if a == 0 else a.
user202729

Dışını dilim yerine başka bir tane kullanmakfor üzere değiştirebilirsiniz . Alt endeksler büyük olanlar üzerine ve en dilim başlayan böylece, tersine çevrilir değiştirmek olmaz ya . forrange2*ps[0]s[p]
Rod




1

Japt, 25 24 bayt

Korkarım bu konuda yanlış yöne gitmiş olabilirim ama farklı bir yaklaşım denemek için zamanım bitiyor.

0Yanlış veya 1doğru çıktılar .

j ?V©vU :ßU/(U=k g)+°UNg

Dene


0

Perl 5 , 291 + 1 (-a) = 292 bayt

Lanet Perl, yerel bir baş denetleyicisine sahip olmadığı için.

use POSIX;&r($_,$_);
sub p{$n=shift;if($n<=1){return;}if($n==2||$n==3){return 1;}if($n%2==0||$n%3==0){return;}for(5..ceil($n/2)){if($n%$_==0){return;}}return 1;}
sub r{$n=shift;$o=shift;if(&p($n)){print $o%$n==0&&$n!=$o?1:0;last;}for(2..ceil($n/2)){if($n%$_==0){&r(($n/$_)+$_+1, $o);last;}}}

Ungolfed versiyonu,

use POSIX;
&r($_,$_);
sub p{
    my $n=shift;
    if($n<=1){
        return;
    }
    if($n==2||$n==3){
        return 1;
    }
    if($n%2==0||$n%3==0){
        return;
    }
    for(5..ceil($n/2)){
        if($n%$_==0){
            return;
        }
    }
    return 1;
}
sub r{
    my $n=shift;
    my $o=shift;
    if(&p($n)){
        print $o%$n==0&&$n!=$o ? 1 : 0;
        last;
    }
    for(2..ceil($n/2)){
        if($n%$_==0){
            &r(($n/$_)+$_+1, $o);
            last;
        }
    }
}

Çevrimiçi deneyin!




0

J , 35 bayt

(~:*0=|~)(1+d+]%d=.0{q:)^:(0&p:)^:_

Çevrimiçi deneyin!

İlk ana faktör olan minimum bölen @ Dennis'in Jelly solüsyonundan çalınmıştı (daha önce kullanıyordum <./@q:).

Yinelemeyi yapmanın daha iyi bir yolu olmalı, ama onu bulamıyorum. İlkellik testinden ( ^:(0&p:)) kaçınmayı ve bunun yerine tersini kullanmaktan kaçınmayı düşündüm, ancak _2{net bir azaltma vermeyecek bazı değişikliklere ihtiyaç duyduğunuzdan bu biraz daha uzun sürecek gibi görünüyor .

Gerçekten de, ilkellik kontrolünde de ebeveynleri bulundurmaktan kaçınmanın bir yolu olması gerektiğini düşünüyorum.

Açıklama (genişletilmiş)

(~: * 0 = |~)(1 + d + ] % d =. 0 { q:) ^: (0&p:) ^:_ Input: N
             (1 + d + ] % d =. 0 { q:) ^: (0&p:) ^:_ Find the final N'
                                       ^:        ^:_  Do while
                                           0&p:       N is not prime
                                   q:                 Get prime factors (in order)
                               0 {                    Take first (smallest divisor)
                          d =.                        Assign this value to d
             1 + d + ] %  d                           Compute (N/d) + 1 + d
(~: * 0 = |~)                                        Is it redivosite?
      0 = |~                                          N = 0 (mod N'), i.e. N'|N
    *                                                 And
 ~:                                                   N =/= N', i.e. N is not prime

0

APL NARS, 43 karakter, 85 bayt

{(⍵≤6)∨0π⍵:0⋄⍵{1=⍴t←π⍵:0=⍵|⍺⋄⍺∇1+↑t+⍵÷↑t}⍵}

(tüm sayı> 6 için bir araya geleceğini umarak) test:

h←{(⍵≤6)∨0π⍵:0⋄⍵{1=⍴t←π⍵:0=⍵|⍺⋄⍺∇1+↑t+⍵÷↑t}⍵}
v←⍳100     
v,¨h¨v
   1 0  2 0  3 0  4 0  5 0  6 0  7 0  8 0  9 0  10 0  11 0
   12 0  13 0  14 1  15 0  16 0  17 0  18 0  19 0  20 0  
   21 0  22 0  23 0  24 0  25 0  26 0  27 0  28 0  29 0  
   30 0  31 0  32 0  33 0  34 0  35 0  36 0  37 0  38 0  
   39 0  40 0  41 0  42 1  43 0  44 1  45 0  46 0  47 0  
   48 0  49 1  50 0  51 0  52 0  53 0  54 0  55 0  56 0  
   57 0  58 0  59 0  60 0  61 0  62 0  63 0  64 0  65 0  
   66 1  67 0  68 0  69 0  70 1  71 0  72 0  73 0  74 0  
   75 0  76 0  77 0  78 0  79 0  80 0  81 0  82 0  83 0  
   84 0  85 0  86 0  87 0  88 0  89 0  90 0  91 0  92 0  
   93 0  94 0  95 0  96 0  97 0  98 0  99 0  100 0  

2 isimsiz fonksiyon kullanma fikri diğer Apl çözümlerine ulaşıyor.

 {(⍵≤60)∨π⍵:0⋄ -- if arg ⍵ is prime or <=6 return 0
  ⍵{1=⍴t←π⍵:0=⍵|⍺⋄ -- if list of factors ⍵ has length 1 (it is prime)
                    -- then return ⍺mod⍵==0
  ⍺∇1+↑t+⍵÷↑t}⍵}   -- else recall this function with args ⍺ and 1+↑t+⍵÷↑t

0

Pyt , 44 bayt

←⁻0`ŕ⁺ĐĐϼ↓Đ3Ș⇹÷+⁺Đṗ¬⇹⁻⇹łŕáĐ0⦋Đ↔ĐŁ⁻⦋⁺|¬⇹ṗ⇹3Ș⊽

Bir açıklama için aşağıdaki koda bakın - sadece farklar (1) döngü başlangıcındaki artışın hesaba katılmasından önce N'nin azalması ve (2) OR yerine OR kullanmasıdır.

Çevrimiçi deneyin!



Bunu soruyu tekrar okumadan önce yaptım ve yalnızca doğru / yanlış istediğini fark ettim.

Pyt, 52 bayt

60`ŕ⁺ĐĐϼ↓Đ3Ș⇹÷+⁺Đṗ¬⇹⁻⇹łŕáĐ0⦋Đ↔ĐŁ⁻⦋⁺|¬⇹Đṗ⇹3Ș∨ł⇹Đƥ⇹ŕ1ł

Tekrar arama sayılarının sonsuz listesini yazdırır.

Açıklama:

6                                                            Push 6
 0                                                           Push unused character
  `                   ł                     ł      ł         Return point for all three loops
   ŕ                                                         Remove top of stack
    ⁺                                                        Increment top of stack (n)
     ĐĐ                                                      Triplicate top of stack (n)
       ϼ↓                                                    Get smallest prime factor of n (returns 1 if n is prime) 
         Đ                                                   Duplicate top of stack
          3Ș⇹                                                Manipulate stack so that the top is (in descending order): [d,(N,N'),d]
             ÷+⁺                                             Calculates N'=(N,N')/d+d+1
                Đṗ¬                                          Is N' not prime?
                   ⇹⁻⇹                                       Decrement N' (so the increment at the beginning doesn't change the value), and keep the boolean on top - end of innermost loop (it loops if top of stack is true)
                       ŕ                                     Remove top of stack
                        á                                    Convert stack to array
                         Đ                                   Duplicate array
                          0⦋Đ                                Get the first element (N)
                             ↔ĐŁ⁻⦋                           Get the last element ((final N')-1)
                                  ⁺                          Increment to get (final N')
                                   |¬                        Does N' not divide N?
                                     ⇹Đṗ                     Is N prime?
                                        ⇹3Ș∨                 Is N prime or does N' not divide N? - end of second loop (loops if top of stack is true)
                                             ⇹Đƥ⇹ŕ           Print N, and reduce stack to [N]
                                                  1          Push garbage (pushes 1 so that the outermost loop does not terminate)


Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.