Czy jestem numerem „redivosite”?


26

Redivosite to słowo portmanteau wymyślone wyłącznie w tym celu. To połączenie redukcji, podziału i kompozytu.

Definicja

Biorąc pod uwagę liczbę całkowitą N> 6 :

  • Jeśli N jest liczbą pierwszą, N nie jest liczbą ponownie złożoną.
  • Jeśli N jest złożony:
    • wielokrotnie obliczyć N '= N / d + d + 1,N' będzie liczbą pierwszą, gdzie d jest najmniejszym dzielnikiem N większym niż 1
    • N jest liczbą ponownie złożoną wtedy i tylko wtedy, gdy końcowa wartość N ' jest dzielnikiem N

Poniżej znajduje się 100 pierwszych numerów Redivosite (brak wpisu OEIS w momencie publikacji):

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

Przykłady

  • N = 13 : 13 jest liczbą pierwszą, więc 13 nie jest liczbą rediwersyjną
  • N = 32 : 32/2 + 3 = 19; 19 nie jest dzielnikiem ani 32, więc 32 nie jest liczbą rediwersyjną
  • N = 260 : 260/2 + 3 = 133, 133/7 + 8 = 27, 27/3 + 4 = 13; 13 jest dzielnikiem lub 260, więc 260 jest liczbą rediwersyjną

Twoje zadanie

  • Biorąc pod uwagę liczbę całkowitą N , zwróć prawdziwą wartość, jeśli w przeciwnym razie jest to liczba redywidualna lub wartość fałszowania. (Możesz również wypisać dowolne dwie różne wartości, o ile są one spójne).
  • Gwarantowane wejście jest większe niż 6 .
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

13
Naprawdę chciałbym, aby wszystkie te wyzwania związane z „sekwencją liczb”, które są tylko sekwencjami liczb z pewną właściwością, byłyby zadawane jako problemy decyzyjne. Wątpię, czy istnieje sposób na ich bezpośrednie wygenerowanie, więc jedynym możliwym rozwiązaniem jest rozwiązanie problemu decyzyjnego, a następnie zawinięcie go w pętlę, która znajdzie N-tą lub pierwszą N lub wszystkie liczby całkowite spełniające tę właściwość.
Martin Ender

3
Lubię sekwencyjne wyzwania, które ogólnie nie są problemami decyzyjnymi , ale myślę, że w tym przypadku lepiej byłoby rozwiązać problem decyzyjny . Nie widzę żadnego związku między warunkami, tak że wypisujesz n- ty lub pierwszy n w sprytny sposób, więc może pozwól wziąć n jako dane wejściowe i sprawdzić, czy jest ono ponownie złożone ?
Pan Xcoder

1
@MartinEnder & Mr.Xcoder To była moja pierwotna intencja (stąd oryginalny tytuł, do którego właśnie przywróciłem) i zmieniłem zdanie. Wydaje mi się, że nie powinno to zrujnować żadnego rozwiązania WIP (z powodów, o których mówisz), więc go edytowałem.
Arnauld

5
@ Mr.Xcoder Tak, o to mi chodziło. Nie mam nic przeciwko wyzwaniom związanym z sekwencją, które faktycznie mają sens jako sekwencja (albo dlatego, że możesz obliczyć a(n)bezpośrednio, albo ponieważ możesz obliczyć termin z poprzednich). Dzięki, Arnauld, za zmianę wyzwania. :)
Martin Ender

Odpowiedzi:


9

Haskell, 91 85 83 80 75 74 bajtów

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

Wypróbuj online!

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

Edycja: -2 bajty dzięki @BMO, -3 bajty dzięki @ H.PWiz i -5 -6 bajtów dzięki @ Ørjan Johansen



W rzeczywistości spraw, aby 74
Ørjan Johansen

@ ØrjanJohansen: Jeszcze raz dziękuję.
nimi

6

Łuska , 14 bajtów

?¬Ṡ¦ΩṗoΓ~+→Πpṗ

Wypróbuj online!

-3 dzięki H.PWiz .


14 bajtów z funkcją czyszczenia w środkuΩ
H.PWiz

@ H.PWiz po prostu nie rozumie Γ...
Erik Outgolfer

Tutaj Γpodana lista [a, b, c ...] będzie miała zastosowanie ~+→Πdo ai [b,c...]. ~+→Πdodaje a+1do product[b,c...]. ajest najmniejszym dzielnikiem, product[b,c...]jestN/d
H.PWiz

@ H.PWiz I pomyślałem o użyciu czynników pierwszych ...
Erik the Outgolfer

6

C (gcc) , 94 89 bajtów

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;}

Wypróbuj online!

Wyjaśnienie

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

Galaretka , 14 bajtów

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

Wypróbuj online!

Jak to działa

ÆḌḊ         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 bajtów

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

Wypróbuj online!

Dane wyjściowe za pośrednictwem kodu wyjścia.

Nie golfowany:

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.

Wypróbuj online!


3

05AB1E , 17 16 bajtów

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

Wypróbuj online!

Wyjaśnienie

[                  # 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 bajtów

<P_QiI.WtPHh+/ZKhPZK

Wypróbuj tutaj!

Jak to działa

iI.WtPHh + / ZKhPZK || Pełny program

  .W || Funkcjonalny podczas. Jako argument przyjmuje dwie funkcje: A i B.
                 || Podczas gdy A (wartość) jest prawdziwa, zmień wartość na B (wartość). The
                 || wartością początkową jest wejście.
    tPH || Pierwsza funkcja, A. Bierze jeden argument, H.
     PH || .. Czynniki główne czynników H.
    t || .. Ogon (usuń pierwszy element). Podczas gdy prawda (H jest złożony):
       h + / ZKhPZK || Druga funkcja, B. Bierze jeden argument, Z:
         / Z || .. Podziel Z, przez:
           KhP || .. Jego najniższy czynnik pierwszy i przypisz go K.   
       h || .. Przyrost.
        + K || I dodaj K.
iI || Sprawdź, czy wynik (ostatnia wartość) dzieli dane wejściowe.

Pierwsze 4 bajty ( <P_Q) sprawdzają tylko, czy dane wejściowe nie są liczbą pierwszą.

Z pomocą Emigny udało mi się zaoszczędzić 3 bajty.


Czy możesz użyć czegoś podobnego head(P)zamiast fiITZ2części, ponieważ najmniejszy dzielnik większy niż 1 zawsze będzie liczbą pierwszą?
Emigna

@Emigna Ninja'd, naprawione i dzięki!
Pan Xcoder

2

Python 3 , 149 bajtów

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

Wypróbuj online!

Stosując podejście sitowe. Powinny być szybkie ( O(N log log N)= złożoność czasowa sita Eratostenesa) nawet przy dużych N(ale zapisuje O(N)liczby całkowite w pamięci)

Uwaga:

  • Można udowodnić, że wszystkie wartości pośrednie nnie przekraczają N, a zamiast tego N > 7 pmożna zastosować range(2,N)zamiast range(2,N+1)przesiewania.
  • /nie działa, //należy go użyć z powodu indeksu listy.
  • Przechowywanie rangew innej zmiennej niestety nie pomaga.

Wyjaśnienie:

  • -~N== N+1.
  • Najpierw tablica sjest inicjowana N+1zerami (Python indeksuje 0, więc indeksy to 0..N)
  • Po inicjalizacji s[n]oczekuje się, 0że nbędzie liczbą pierwszą, a pdla pliczby minimalnej, która dzieli, njeśli njest liczbą złożoną. s[0]a s[1]wartości nie są ważne.
  • Dla każdego pw zakresie [2 .. N-1]:

    • Jeśli s[p] < 1(to znaczy s[p] == 0), to pjest liczbą pierwszą i dla każdego z nich qjest wielokrotnością pi s[q] == 0, przypisuj s[q] = p.
  • Ostatnie 2 wiersze są proste, z tym wyjątkiem, że n//s[n]-~s[n]== (n // s[n]) + s[n] + 1.


Python 3 , 118 bajtów

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

Wypróbuj online!

Kosztem nieco gorszej wydajności. (Ten działa w O(N log N)złożoności czasowej, przy założeniu rozsądnej implementacji wycinków Pythona)


Odpowiednik pełnego programu wynosi 117 bajtów .


Możesz użyć n//s[n]-~s[n]zamiast n//s[n]+s[n]+1149 bajtów.
Pan Xcoder,

@ Mr.Xcoder Thanks!
user202729

Myślę też, że or pmoże być|p
Pan Xcoder

@ Mr.Xcoder Nie, or pwykonuje logiczne lub, podczas gdy |pwykonuje bitowe lub. To znaczy, a or bjest b if a == 0 else a.
user202729

Możesz zmodyfikować zewnętrzną, foraby użyć plasterka zamiast innegofor . rangeJest odwrócony, więc niższe indeksy zastąpią te duże, i uruchomieniem plasterek na 2*pnie zastąpi s[0]lub s[p].
Rod




1

Japt, 25 24 bajtów

Obawiam się, że mogłem pójść w tym kierunku, ale zabrakło mi czasu na wypróbowanie innego podejścia.

Dane wyjściowe 0dla false lub 1true.

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

Spróbuj


0

Perl 5 , 291 + 1 (-a) = 292 bajtów

Darn Perl za to, że nie ma natywnego sprawdzania liczb pierwszych.

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;}}}

Wersja bez golfa,

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;
        }
    }
}

Wypróbuj online!




0

J , 35 bajtów

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

Wypróbuj online!

Minimalny dzielnik będący pierwszym czynnikiem podstawowym został skradziony z rozwiązania Jelly @ Dennisa (wcześniej używałem <./@q:).

Powinien istnieć lepszy sposób na wykonanie iteracji, ale nie mogę tego znaleźć. Myślałem o tym, aby uniknąć wykonywania testu pierwotności ( ^:(0&p:)) i zamiast tego używać negatywnych, ale wygląda na to, że będzie to nieco dłużej, ponieważ będziesz potrzebować _2{i kilku zmian, które mogą nie dać zmniejszenia netto.

Naprawdę czuję, że musi istnieć sposób na uniknięcie parens wokół kontroli pierwotności.

Objaśnienie (rozwinięty)

(~: * 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 znaki, 85 bajtów

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

(mając nadzieję, że zbiegnie się dla wszystkich liczb> 6) 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  

Pomysł użycia 2 anonimowych funkcji trafił do innego rozwiązania Apl.

 {(⍵≤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 bajty

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

Wyjaśnij poniższy kod - jedyne różnice to (1), że N jest wcześniej zmniejszany, aby uwzględnić przyrost na początku pętli, i (2) używa NOR zamiast OR.

Wypróbuj online!



Zrobiłem to, zanim ponownie przeczytałem pytanie i zauważyłem, że chciał tylko prawdy / fałszu.

Pyt, 52 bajty

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

Drukuje nieskończoną listę liczb Redivosite.

Wyjaśnienie:

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)


Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.