Обчисліть функцію Мертенса


18

Давши додатне ціле число n , обчисліть значення функції Мертенса M ( n ) де

Мертенс

і μ ( k ) - функція Мебіуса, де μ ( k ) = 1, якщо k має парне число чітких простих факторів, -1 якщо k має непарне число різних простих факторів, і 0, якщо прості фактори не відрізняються.

  • Це тому створіть найкоротший код для функції або програми, яка обчислює функцію Мертенса для вхідного цілого числа n > 0.
  • Це послідовність OEIS A002321 .

Випробування

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


Чи можемо ми повернути True замість 1 ? Відповідна мета-дискусія: Чи повинні бути дозволені булеви, де потрібне число?
Денніс

@Dennis Звичайно, якщо ваша мова трактує Істину як 1.
миль

Відповіді:


6

Желе , 6 байт

:Ḋ߀SC

Спробуйте в Інтернеті! або перевірити менші тестові випадки . (займає деякий час)

Фон

Для цього використовується властивість

property by David W. Wilson

від A002321 , що призводить до наступної рекурсивної формули.

recursive formula

Як це працює

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

Математика, 22 20 байт

Завдяки @miles за збереження 2 байт.

Tr@*MoebiusMu@*Range

Пояснення

Range

Створіть список від 1 до введення.

MoebiusMu

Знайдіть MoebiusMuкожне число

Tr

Підсумуйте результат.


2
Мені подобається, як у Mathematica є вбудований для всього, але це, як правило, довше мови для гри в гольф. = D
DJMcMayhem

5
Ще один виклик для mthmca - версії Mathematica, оптимізованої командною назвою довжини.
Майкл Стерн

11

Python 2, 45 37 байт

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

Перевірте це на Ideone .

Фон

Для цього використовується властивість

власність Девіда В. Вілсона

від A002321 , що призводить до наступної рекурсивної формули.

рекурсивна формула

Як це працює

Ми використовуємо рекурсію не тільки для обчислення М за коефіцієнтами, але і для обчислення суми цих зображень. Це заощаджує 8 байтів за допомогою наступної прямої реалізації.

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

Коли f викликається одним аргументом n , необов'язковий аргумент k за замовчуванням до 2 .

Якщо n = 1 ,n<k виходить True, а f повертає це значення. Це наш базовий випадок.

Якщо n> 1 , n<kспочатку повертається False і orвиконується наступний код . f(n/k)рекурсивно обчислює один доданок суми, який віднімається від зворотного значення f(n,k+1). Останній приріст k і рекурсивно викликає f , тим самим повторюючи можливі значення k . Як тільки n <k + 1 або n = 1 , f(n,k+1)повернеться 1 , закінчення рекурсії.


Нічого собі, це навіть коротше, ніж реалізація Mobius. codegolf.stackexchange.com/a/70024/34718
mbomb007

Набагато коротше. :) Зараз, все одно.
Денніс



5

Желе , 9 байт

RÆFỊNP€FS

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

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

Желе , 7 байт

Ị*%ðþÆḊ

Не дуже ефективний; детермінанти важкі.

Спробуйте в Інтернеті! або перевірити менші тестові випадки . (займає деякий час)

Фон

Для цього використовується формула з A002321 :

M (n) - визначник булевої матриці A n × n , де a i, j дорівнює 1, якщо j = 1 або i | j , а 0 в іншому випадку.

Як це працює

Ị*%ðþÆḊ  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 байт

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;

Наскільки я знаю, php не вистачає нічого, як функціональність простих чисел, тому це є біль. Можливо, це можливо зробити і краще.

використовувати як:

 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

Ракетка 103 байти

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

Безумовно:

(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 байт)

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

Демонстрація в Інтернеті

Використовує формулу від OEIS

sum(k = 1..n, a([n/k])) = 1. - Девід В. Вілсон, 27 лютого 2012 року

і оператор запам'ятовування CJam j.

Розсічення

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 байт

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

Порт @ відповідь Денніса на Python.


2

Джулія, 26 25 байт

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

Спробуйте в Інтернеті!

Фон

Для цього використовується властивість

власність Девіда В. Вілсона

від A002321 , що призводить до наступної рекурсивної формули.

рекурсивна формула

Як це працює

Ми переосмислюємо одинарного оператора !для наших цілей.

n÷(2:n)обчислює всі необхідні коефіцієнти, наші переосмислені ! відображається над ними, і нарешті сума всіх рекурсивних викликів віднімається від 1 .

На жаль,

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

не працює з діадичної суми задушиться в порожній колекції.

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

це виправляє, але він не зберігає жодних байт і повертає True для введення 1 .



1

Скала, 53 байти

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

Порт детінського відповіді.

Я назвав метод ?, який є лексемою, яка не прилипає до літер.



1

Власне, 18 17 16 байт

Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

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 байт

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

Обчислює функцію Мертенса n використанні суми функції Мебіуса за діапазон [1, n].

Використання

   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

Пояснення

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.