Berechnen Sie die Mertens-Funktion

18

Berechnen Sie bei einer positiven ganzen Zahl n den Wert der Mertens-Funktion M ( n ) wobei

Mertens

und μ ( k ) ist die Möbius-Funktion, wobei μ ( k ) = 1 ist, wenn k eine gerade Anzahl unterschiedlicher Primfaktoren hat, -1, wenn k eine ungerade Anzahl unterschiedlicher Primfaktoren hat, und 0, wenn die Primfaktoren nicht verschieden sind.

  • Dies ist Erstellen Sie also den kürzesten Code für eine Funktion oder ein Programm, die bzw. das die Mertens-Funktion für eine Ganzzahl n > 0 berechnet .
  • Dies ist die OEIS-Sequenz A002321 .

Testfälle

n M(n)
1 1
2 0
3 -1
4 -1
5 -2
6 -1
7 -2
8 -2
9 -2
10 -1
117 -5
5525 5
7044 -25
8888 4
10000 -23
Meilen
quelle
Eng verwandt
Peter Taylor
Können wir True anstelle von 1 zurückgeben ? Relevante Metadiskussion
Dennis
@ Tennis Sicher, wenn Ihre Sprache True als 1.
Meilen

Antworten:

6

Gelee , 6 Bytes

:Ḋ߀SC

Probieren Sie es online! oder überprüfen Sie die kleineren Testfälle . (dauert eine Weile)

Hintergrund

Dies nutzt die Eigenschaft

Eigentum von David W. Wilson

von A002321 , was zu der folgenden rekursiven Formel führt.

rekursive Formel

Wie es funktioniert

:Ḋ߀SC  Main link. Argument: n

 Ḋ      Dequeue; yield [2, ..., n].
:       Perform the integer division of n by each k in [2, ..., n].
  ߀    Recursively call the main link on each result.
    S   Sum; add the results from the recursive calls.
     C  Complement; map the sum r to 1 - r.
Dennis
quelle
11

Mathematica, 22-20 Bytes

Vielen Dank an @miles für das Speichern von 2 Bytes.

Tr@*MoebiusMu@*Range

Erläuterung

Range

Erstellen Sie eine Liste von 1 zur Eingabe.

MoebiusMu

Suche MoebiusMunach jeder Nummer

Tr

Summiere das Ergebnis.

JungHwan min
quelle
2
Ich mag, wie Mathematica für alles eine eingebaute Sprache hat, aber normalerweise ist sie sowieso länger als eine Golfsprache. = D
DJMcMayhem
5
Ein weiterer Aufruf für mthmca, die befehlsnamenlängenoptimierte Version von Mathematica.
Michael Stern
11

Python 2, 45 37 Bytes

f=lambda n,k=2:n<k or f(n,k+1)-f(n/k)

Teste es auf Ideone .

Hintergrund

Dies nutzt die Eigenschaft

Eigentum von David W. Wilson

von A002321 , was zu der folgenden rekursiven Formel führt.

rekursive Formel

Wie es funktioniert

Wir verwenden die Rekursion nicht nur, um M für die Quotienten zu berechnen, sondern auch, um die Summe dieser Bilder zu berechnen. Dies spart 8 Bytes bei der folgenden einfachen Implementierung.

M=lambda n:1-sum(M(n/k)for k in range(2,n+1))

Wenn f mit einem einzelnen Argument n aufgerufen wird , ist das optionale Argument k standardmäßig 2 .

Wenn n = 1 ist , n<kergibt dies True und f gibt diesen Wert zurück. Dies ist unser Basisfall.

Wenn n> 1 ist , wird n<kanfangs False zurückgegeben und der folgende Code orausgeführt. f(n/k)berechnet rekursiv einen Term der Summe, der vom Rückgabewert von subtrahiert wird f(n,k+1). Letzteres inkrementiert k und ruft rekursiv f auf , wodurch die möglichen Werte von k durchlaufen werden . Sobald n <k + 1 oder n = 1 ist , f(n,k+1)wird 1 zurückgegeben und die Rekursion beendet.

Dennis
quelle
Wow, das ist noch kürzer als die Mobius-Implementierung. codegolf.stackexchange.com/a/70024/34718
mbomb007
Viel kürzer. :) Jetzt jedenfalls.
Dennis
7

05AB1E , 16 15 Bytes

LÒvX(ygmyyÙïQ*O

Erläuterung

L        # range [1 .. n]
Ò        # list of prime factors for each in list
v        # for each prime factor list
 X(ygm   # (-1)^len(factors)
 yyÙïQ*  # multiplied by factors == (unique factors)
 O       # sum

Probieren Sie es online!

Emigna
quelle
7

Brachylog , 22 bis 20 Bytes

yb:1a+
$p#dl:_1r^|,0

Probieren Sie es online!

Erläuterung

yb                 The list [1, 2, …, Input]
  :1a              Apply predicate 1 (second line) to each element
     +             Sum the resulting list


    $p#d               All elements of the list of prime factors of the Input are distinct
        l:_1r^         Output = (-1)^(<length of the list of prime factors>)
|                  Or
    ,0                 Output = 0
Tödlich
quelle
5

Gelee , 9 Bytes

RÆFỊNP€FS

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

RÆFỊNP€FS  Main link. Argument: n

R          Range; yield [1, ..., n].
 ÆF        Factor; decompose each integer in that range into prime-exponent pairs.
   Ị       Insignificant; yield 1 for argument 1, 0 for all others.
    N      Negative; map n to -n.
           This maps primes to 0, exponent 1 to -1, and all other exponents to 0.
     P€    Reduce the columns of the resulting 2D arrays by multiplication.
           The product of the prime values will always be 0; the product of the
           exponent values is 0 if any exponent is greater than, 1 if there is an
           even number of them, -1 is there is an odd number of them.
       FS  Flatten and sum, computing the sum of µ(k) for k in [1, ..., n].
Dennis
quelle
5

Haskell, 29 27 Bytes

f n=1-sum(f.div n<$>[2..n])
Damien
quelle
3

Gelee , 7 Bytes

Ị*%ðþÆḊ

Nicht sehr effizient; Determinanten sind schwer.

Probieren Sie es online! oder überprüfen Sie die kleineren Testfälle . (dauert eine Weile)

Hintergrund

Dies verwendet eine Formel aus A002321 :

M (n) ist die Determinante der Booleschen Matrix A n × n , wobei a i, j ist 1 , wenn j = 1 oder i | j und sonst 0 .

Wie es funktioniert

Ị*%ðþÆḊ  Main link. Argument: n

   ð     Combine the preceding atoms into a chain (unknown arity).
         Begin a new, dyadic chain with arguments a and b.
Ị        Insignificant; return 1 iff a = 1.
  %      Compute a % b.
 *       Compute (a == 1) ** (a % b).
         This yields 1 if a = 1, or if a ≠ 1 and a % b = 0; otherwise, it yields 0.
    þ    Table; construct the matrix A by calling the defined chain for every pair
         of integers in [1, ..., n].
     ÆḊ  Compute the determinant of the resulting matrix.
Dennis
quelle
3

PHP, 113 Bytes

for(;$i=$argv[1]--;){for($n=$j=1;$j++<$i;)if(!($i%$j)){$i/=$j;$n++;if(!($i%$j))continue 2;}$a+=$n%2?1:-1;}echo$a;

Soweit ich weiß, fehlt PHP so etwas wie eine Primzahlfunktionalität, also ist dies eine Art Schmerz. Es ist wahrscheinlich möglich, es besser zu machen.

verwenden wie:

 php -r "for(;$i=$argv[1]--;){for($n=$j=1;$j++<$i;)if(!($i%$j)){$i/=$j;$n++;if(!($i%$j))continue 2;}$a+=$n%2?1:-1;}echo$a;" 10000
user59178
quelle
2

Schläger 103 Bytes

(λ(N)(for/sum((n(range 1 N)))(define c(length(factorize n)))(cond[(= 0 c)0][(even? c)1][(odd? c)-1])))

Ungolfed:

(define f
  (λ(N)
    (for/sum ((n (range 1 N)))
      (define c (length (factorize n)))
      (cond
        [(= 0 c) 0]
        [(even? c) 1]
        [(odd? c) -1]))))
rnso
quelle
2

CJam (20 Bytes)

qiM{_,:)(@@f/{j-}/}j

Online-Demo

Verwendet die Formel von OEIS

sum(k = 1..n, a([n/k])) = 1. - David W. Wilson, 27. Februar 2012

und CJam Memo-Operator j.

Präparation

qi       e# Read stdin as an integer
M{       e# Memoise with no base cases
         e#   Memoised function: stack contains n
  _,:)(  e#   Basic manipulations to give n [2 .. n] 1
  @@f/   e#   More basic manipulations to give 1 [n/2 ... n/n]
  {j-}/  e#   For each element of the array, make a memoised recursive call and subtract
}j
Peter Taylor
quelle
2

JavaScript (ES6), 50 Byte

n=>[1,...Array(n-1)].reduce((r,_,i)=>r-f(n/++i|0))

Port von @ Dennis's Python Antwort.

Neil
quelle
2

Julia, 26 25 Bytes

!n=1-sum(map(!,n÷(2:n)))

Probieren Sie es online!

Hintergrund

Dies nutzt die Eigenschaft

Eigentum von David W. Wilson

von A002321 , was zu der folgenden rekursiven Formel führt.

rekursive Formel

Wie es funktioniert

Wir definieren den unären Operator neu ! für unsere Zwecke.

n÷(2:n)berechnet alle benötigten Quotienten, unsere neu definiert ! wird über ihnen abgebildet und schließlich wird die Summe aller rekursiven Aufrufe von 1 subtrahiert .

Unglücklicherweise,

!n=1-sum(!,n÷(2:n))

funktioniert nicht, da dyadic sum an einer leeren Sammlung erstickt.

!n=n<2||1-sum(!,n÷(2:n))

behebt das, speichert aber keine Bytes und gibt für Eingabe 1 True zurück .

Dennis
quelle
2

C 51 50 47 Bytes

f(n,t,u){for(t=u=1;n/++u;t-=f(n/u));return t;}

Edit: Danke an @Dennis für -3 Bytes!

Ceilingcat
quelle
1

Scala, 53 Bytes

def?(n:Int,k:Int=2):Int=if(n<k)1 else?(n,k+1)- ?(n/k)

Ein Port von Dennis 'Pythin-Antwort.

Ich habe die Methode aufgerufen ?, die ein Token ist, das sich nicht an Buchstaben hält.

corvus_192
quelle
1

Pyth, 12 Bytes

Definiert eine Funktion y, die die n.

L-1syM/LbtSb

Testsuite hier. (Beachten Sie, dass yhier die deklarierte Funktion tatsächlich aufgerufen wird.)

Steven H.
quelle
1

Eigentlich 18 17 16 Bytes

Golfvorschläge sind willkommen. Probieren Sie es online!

R`;y;l0~ⁿ)π=*`MΣ

Ungolfing

         Implicit input n.
R        Push the range [1..n].
`...`M   Map the following function over the range. Variable k.
  ;        Duplicate k.
  y        Push the distinct prime factors of k. Call it dpf.
  ;        Duplicate dpf.
  l        Push len(dpf).
  0~       Push -1.
  ⁿ        Push (-1)**len(dpf).
  )        Move (-1)**len(dpf) to BOS. Stack: dpf, k, (-1)**len(dpf)
  π        Push product(dpf).
  =        Check if this product is equal to k.
            If so, then k is squarefree.
  *        Multiply (k is squarefree) * (-1)**(length).
            If k is NOT squarefree, then 0.
            Else if length is odd, then -1.
            Else if length is even, then 1.
           This function is equivalent to the Möbius function.
Σ        Sum the results of the map.
         Implicit return.
Sherlock9
quelle
1

PARI / GP, 24 Bytes

n->sum(x=1,n,moebius(x))
Alephalpha
quelle
0

J, 19 Bytes

1#.1*/@:-@~:@q:@+i.

Berechnet die Mertens-Funktion auf n anhand der Summe der Möbius-Funktion über den Bereich [1, n].

Verwendung

   f =: 1#.1*/@:-@~:@q:@+i.
   (,.f"0) 1 2 3 4 5 6 7 8 9 10 117 5525 7044 8888 10000
    1   1
    2   0
    3  _1
    4  _1
    5  _2
    6  _1
    7  _2
    8  _2
    9  _2
   10  _1
  117  _5
 5525   5
 7044 _25
 8888   4
10000 _23

Erläuterung

1#.1*/@:-@~:@q:@+i.  Input: integer n
                 i.  Range [0, 1, ..., n-1]
   1            +    Add 1 to each
             q:@     Get the prime factors of each
          ~:@        Sieve mask of each, 1s at the first occurrence
                     of a value and 0 elsewhere
        -@           Negate
    */@:             Reduce each using multiplication to get the product
1#.                  Convert that to decimal from a list of base-1 digits
                     Equivalent to getting the sum
Meilen
quelle