Tính toán hàm Mertens


18

Cho một số nguyên dương n , tính giá trị của hàm Mertens M ( n ) trong đó

Mertens

μ ( k ) là hàm Möbius trong đó μ ( k ) = 1 nếu k có số lượng các thừa số nguyên tố riêng biệt, -1 nếu k có số lẻ các thừa số nguyên tố riêng biệt và 0 nếu các yếu tố nguyên tố không khác biệt.

  • Đây là vì vậy hãy tạo mã ngắn nhất cho hàm hoặc chương trình tính toán hàm Mertens cho số nguyên đầu vào n > 0.
  • Đây là trình tự OEIS A002321 .

Các trường hợp thử nghiệm

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


Chúng ta có thể trả về True thay vì 1 không? Thảo luận meta có liên quan: Có nên cho phép Booleans khi cần một số?
Dennis

@Dennis Chắc chắn nếu diễn giải ngôn ngữ của bạn Đúng như 1.
dặm

Câu trả lời:


6

Thạch , 6 byte

:Ḋ߀SC

Hãy thử trực tuyến! hoặc xác minh các trường hợp thử nghiệm nhỏ hơn . (phải mất một lúc)

Lý lịch

Điều này sử dụng tài sản

tài sản của David W. Wilson

từ A002321 , dẫn đến công thức đệ quy sau.

công thức đệ quy

Làm thế nào nó hoạt động

:Ḋ߀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.

11

Toán học, 22 20 byte

Cảm ơn @miles đã lưu 2 byte.

Tr@*MoebiusMu@*Range

Giải trình

Range

Tạo một danh sách từ 1 đến đầu vào.

MoebiusMu

Tìm MoebiusMutừng số

Tr

Tính tổng kết quả.


2
Tôi thích cách Mathicala tích hợp sẵn mọi thứ, nhưng dù sao nó thường dài hơn ngôn ngữ chơi gôn. = D
DJMcMayhem

5
Một cách gọi khác cho mippyca, phiên bản tối ưu hóa tên lệnh của Mathicala.
Michael Stern

11

Python 2, 45 37 byte

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

Kiểm tra nó trên Ideone .

Lý lịch

Điều này sử dụng tài sản

tài sản của David W. Wilson

từ A002321 , dẫn đến công thức đệ quy sau.

công thức đệ quy

Làm thế nào nó hoạt động

Chúng tôi sử dụng đệ quy không chỉ để tính M cho các chỉ số, mà còn tính tổng của các hình ảnh đó. Điều này tiết kiệm 8 byte sau đây, thực hiện đơn giản.

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

Khi f được gọi với một đối số n , đối số tùy chọn k mặc định là 2 .

Nếu n = 1 , n<kmang lại Truef trả về giá trị này. Đây là trường hợp cơ sở của chúng tôi.

Nếu n> 1 , n<kban đầu trả về Sai và mã sau orđược thực thi. f(n/k)đệ quy tính một thuật ngữ của tổng, được trừ vào giá trị trả về của f(n,k+1). Cái sau tăng k và gọi đệ quy f , do đó lặp lại các giá trị có thể có của k . Khi n <k + 1 hoặc n = 1 , f(n,k+1)sẽ trả về 1 , kết thúc đệ quy.


Wow, nó thậm chí còn ngắn hơn so với triển khai Mobius. codegolf.stackexchange.com/a/70024/34718
mbomb007

Ngắn hơn rất nhiều :) Bây giờ, dù sao đi nữa.
Dennis

7

05AB1E , 16 15 byte

LÒvX(ygmyyÙïQ*O

Giải trình

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

Hãy thử trực tuyến!


7

Brachylog , 22 20 byte

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

Hãy thử trực tuyến!

Giải trình

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

5

Thạch , 9 byte

RÆFỊNP€FS

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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].


3

Thạch , 7 byte

Ị*%ðþÆḊ

Không hiệu quả lắm; yếu tố quyết định là khó khăn.

Hãy thử trực tuyến! hoặc xác minh các trường hợp thử nghiệm nhỏ hơn . (phải mất một lúc)

Lý lịch

Điều này sử dụng một công thức từ A002321 :

M (n) là định thức của ma trận Boolean A n × n , trong đó a i, j1 nếu j = 1 hoặc i | j0 khác.

Làm thế nào nó hoạt động

Ị*%ðþÆḊ  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.

3

PHP, 113 byte

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;

Theo như tôi biết thì php thiếu bất cứ thứ gì như chức năng số nguyên tố nên đây là một nỗi đau. Có lẽ có thể làm tốt hơn.

sử dụng như:

 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

2

Vợt 103 byte

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

Ung dung:

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

2

CJam (20 byte)

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

Bản demo trực tuyến

Sử dụng công thức từ OEIS

sum(k = 1..n, a([n/k])) = 1. - David W. Wilson, ngày 27 tháng 2 năm 2012

và nhà điều hành ghi nhớ của CJam j.

Mổ xẻ

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

2

JavaScript (ES6), 50 byte

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

Cổng câu trả lời Python của @ Dennis.


2

Julia, 26 25 byte

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

Hãy thử trực tuyến!

Lý lịch

Điều này sử dụng tài sản

tài sản của David W. Wilson

từ A002321 , dẫn đến công thức đệ quy sau.

công thức đệ quy

Làm thế nào nó hoạt động

Chúng tôi xác định lại các nhà điều hành unary ! cho mục đích của chúng ta.

n÷(2:n)tính toán tất cả các chỉ tiêu cần thiết, xác định lại của chúng tôi ! được ánh xạ qua chúng và cuối cùng tổng của tất cả các cuộc gọi đệ quy được trừ đi từ 1 .

Không may,

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

không hoạt động vì tổng dyadic sẽ bị sặc trên một bộ sưu tập trống.

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

sửa lỗi này, nhưng nó không lưu bất kỳ byte nào và trả về True cho đầu vào 1 .


2

C, 51 50 47 byte

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

Chỉnh sửa: Cảm ơn @Dennis cho -3 byte!


1

Scala, 53 byte

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

Một cổng câu trả lời pythin của Dennis.

Tôi đã gọi phương thức ?, đó là một mã thông báo không dính vào các chữ cái.



1

Thật ra, 18 17 16 byte

Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

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.


0

J, 19 byte

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

Tính toán hàm Mertens trên n sử dụng tổng hàm Möbius trong phạm vi [1, n].

Sử dụng

   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

Giải trình

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.