Fungsi Möbius


23

Fungsi Möbius

Fungsi Möbius adalah fungsi teori bilangan penting.

Kiriman Anda harus menerima bilangan bulat positif ndan mengembalikan nilai fungsi Möbius yang dievaluasi pada n.

Definisi

Fungsi Möbius μ (n) didefinisikan sebagai berikut:

       |  1 if n is squarefree and has an even number of distinct prime factors
μ(n) = | -1 if n is squarefree and has an odd number of distinct prime factors
       |  0 otherwise

ndisebut squarefree jika eksponen faktorisasi utama n semuanya benar-benar kurang dari dua. (Atau: Tidak ada kekuatan pangkat dua pembagi n).

Uji kasus

Di sini Anda dapat melihat 50 nilai pertama μ:

Gambar Domain Publik dari Wikipedia

Fungsi Möbius adalah nomor urut A008683 di OEIS.

Ini adalah 77 nilai pertama:

1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1, 0, 1, 1, -1, 0, 0, 1, 0, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 0, -1, -1, -1, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, 0, 1, 0, 1, 1, -1, 0, -1, 1, 0, 0, 1, -1, -1, 0, 1, -1, -1, 0, -1, 1, 0, 0, 1

Nilai yang lebih besar juga dapat dengan mudah diperiksa di Wolframalpha.com atau dalam file-b dari OEIS , seperti yang disarankan oleh @ MartinBüttner.

Jawaban:


15

Python 2, 48 byte

m=lambda n,d=1:d%n and-m(d,n%d<1)+m(n,d+1)or 1/n

Versi 51 byte sebelumnya:

m=lambda n:1/n-sum(m(k)for k in range(1,n)if n%k<1)

Möbius-membalikkan urutan 1,0,0,0,0....

Fungsi Möbius memiliki properti yang untuk setiap n>1, fungsi Möbius dari npembagi berjumlah 0. Jadi, untuk n>1, μ(n)dihitung dengan meniadakan jumlah μ(k)untuk semua pembagi yang tepat kdari n. Sebab n=1, outputnya adalah 1.

Kode menangani kasus dasar dengan menambahkan lantai-divisi 1/n, yang memberikan 1untuk n==1dan 0sebaliknya.

Terima kasih kepada Dennis karena telah menghemat 3 byte dengan penanganan rekursif yang lebih baik yang terinspirasi oleh struktur yang sama dalam tantangan ini .


13

Jelly , 7 byte

Kode:

ÆF>1’PS

Penjelasan:

ÆF       # This computes the prime factorization as well as the exponent
  >1     # Compares each element if it's greater than 1, resulting in 1's and 0's
    ’    # Decrement on each element
     P   # Compute the product
      S  # Compute the sum of the list

Misalnya, angka 10 :

ÆF       # [[2, 1], [5, 1]]
  >1     # [[1, 0], [1, 0]]
    ’    # [[0, -1], [0, -1]]
     P   # [0, 1]
      S  # 1

Dan menghasilkan 1 .

Cobalah online .


-1 byte: ÆFỊNPS(tidak yakin apakah itu built-in saat itu, tetapi harus baik-baik saja sekarang).
Erik the Outgolfer

10

Mathematica, 9 byte

MoebiusMu

Tentu saja, Mathematica memiliki built-in. (Dan mungkin akan dikalahkan oleh Jelly.)


7

CJam, 18 15 byte

WrimFz~\1&+f/:*

Fakta bahwa CJam mengembalikan 1 dalam builtin factorisation untuk n = 1membuat hal-hal sedikit rumit.

Cobalah online | Suite uji

Terima kasih kepada @PeterTaylor untuk 1&+trik yang rapi untuk menangani 1 kasing .

Penjelasan

W                 Push -1
 ri               Push input as int
   mF             Factorise input into [base exponent] pairs
     z~           Zip and unwrap pairs, leaving stack like [-1 bases exponents]
       \1&        Setwise intersect bases with 1, giving [1] for 1 and [] otherwise
          +       Append to exponent array
           f/     Divide the previously pushed -1 by each element in the array 
                  This gives -1 for 1s and 0 otherwise, since / is int division
             :*   Take product

Sebab n > 1, array yang dimodifikasi hanyalah array eksponen. Jika nsquarefree maka array adalah semua 1s, yang menjadi semua -1s setelah pembagian. Jika tidak, jika n memiliki pembagi kuadrat utama, maka akan ada 0 di suatu tempat setelah pembagian, menghasilkan produk 0.

Untuk n = 1array yang dimodifikasi adalah [1] + [1], yang menjadi [-1 -1]setelah pembagian, memberikan produk 1.


Alternatif 16:

rimF{1#2+3%(}%:*

Ini menggunakan #(menemukan) pada setiap [base exponent]array untuk mencari 1, lalu memetakan -1 -> 0, 0 -> 1, 1 -> -1.


6

Ruby, 65 + 7 = 72 62 + 7 = 69 byte

->x{((d=x.prime_division).all?{|_,n|n<2}?1:0)*(d.size%2*-2+1)}

+7 byte untuk -rprimebendera.

Kami melakukan ini dengan cara yang sangat naif:

->x{
 (
  (d=x.prime_division)  # ex. input 20 results in [[2,2],[5,1]] here
  .all?{|_,n|n<2}?      # are all factors' exponents under 2?
  1:0                   # if so, result in a 1; otherwise, a 0
 )
 *                      # multiply that 1 or 0 by...
  (d.size%2*-2+1)       # magic
}

Bagian "ajaib" menghasilkan 1 jika angkanya genap dan -1 jika tidak. Begini caranya:

Expression       Even  Odd
--------------------------
d.size%2         0     1
d.size%2*-2      0     -2
d.size%2*-2+1    1     -1

5

Pyth, 9 byte

^_{IPQlPQ

Penjelasan:

^_{IPQlPQ    Implicit: Q=input
    PQ       Prime factorization of Q
  {I         Is invariant under uniquify.
  {IPQ       1 if Q is squarefree; 0 otherwise.
 _{IPQ       -1 if Q is squarefree; 0 otherwise.
^     lPQ    Exponentiation to length of PQ.

Coba di sini .


5

Labirin , 87 byte

1
:
}
?   @ "}){/{=:
""({! "      ;
} )   :}}:={%"
* _}}){     ;
{      #}):{{
")`%#/{+

Cobalah online!

Penjelasan singkat

Berikut port algoritma yang digunakan, dengan Python:

divisor = 1
mobius = 1
n = int(input())

while n != 1:
  divisor += 1
  count = 0

  while n % divisor == 0:
    n //= divisor
    count += 1

  mobius *= (count + 3)//(count + 1)%3*-1 + 1

print(mobius)

Penjelasan panjang

Primer yang biasa di Labyrinth:

  • Labyrinth berbasis stack dan dua dimensi, dengan eksekusi dimulai pada karakter yang dikenal pertama. Ada dua tumpukan, tumpukan utama dan tumpukan pembantu, tetapi sebagian besar operator hanya bekerja di tumpukan utama.
  • Di setiap cabang labirin, bagian atas tumpukan diperiksa untuk menentukan ke mana harus pergi berikutnya. Negatif belok kiri, nol lurus ke depan dan positif belok kanan.

Eksekusi untuk program ini dimulai di kiri atas 1.

Outer preparation
=================

1        Pop 0 (stack is bottomless and filled with 0s) and push 0*10+1 = 1
:}       Duplicate and shift to auxiliary stack
?        Read int from input
         Stack is now [div=1 n | mob=1]

Top of stack positive but can't turn right. Turn left into outer loop.

Begin outer loop
================
Inner preparation
-----------------

(        Decrement top of stack

If top was 1 (and is now zero), move forward and do...
------------------------------------------------------

{!       Print mob
@        Terminate

If top of stack was greater than 1, turn right and do...
--------------------------------------------------------

)        Increment n back to its previous value
_}       Push 0 and shift to aux
         This will count the number of times n can be divided by div
}){      Increment div
         Stack is now [div n | count mob]

Inner loop
----------

:}}      Dup n, shift both n's to aux
:=       Dup div and swap top of main with top of aux
{%       Shift div down and take mod
         Stack is now [div n%div | n count mob]

If n%div == 0, move forward and do...
-----------------------------------

;        Pop n%div
:={/     Turn n into n/div
{)}      Increment count
         (continue inner loop)

If n%div != 0, turn right (breaking out of inner loop) and do...
================================================================

;        Pop n%div
{{       Pull n and count from aux
:)}      Dup and increment count, giving (count+1), and shift to aux
#+       Add length of stack to count, giving (count+3)
{/       Calculate (count+3)/(count+1)
#%       Mod by length of stack, giving (count+3)/(count+1)%3
`        Multiply by -1
)        Increment, giving (count+3)/(count+1)%3*-1 + 1
         This is 1 if count was 0, -1 if count was 1 and 0 if count > 1
{*}      Multiply mob by this number
         (continue outer loop)


4

R 39 16 byte

numbers::moebius

Membutuhkan Anda menginstal paket nomor pada sistem Anda ...

Sunting: Jauh lebih mudah jika saya membaca spesifikasi dengan benar [terima kasih @AlexA.]


Ini mengembalikan fungsi Möbius yang dievaluasi untuk setiap bilangan bulat dari 1 ke input, tetapi tugas untuk tantangan ini hanyalah untuk mengevaluasi fungsi Möbius pada input.
Alex A.

Sepanjang baris jawaban Mathematica, Anda bahkan bisa melakukannya hanya numbers::moebiusuntuk 16 byte.
Alex A.

3

Pyth , 16 Bytes

?nl{PQlPQZ^_1lPQ

Cobalah online!

Jawaban Pyth pertama saya yang sebenarnya. Saran dihargai! :)

Penjelasan

Solusi saya menggunakan fakta bahwa angka adalah kuadrat bebas, jika faktor prima tidak mengandung angka lebih dari sekali. Jika input bebas square, Fungsi Möbius mengambil nilai -1 ^ (jumlah primefaktor).


?n        if not equal
  l{PQ      length of the list of the distinct input-Primefactors
  lPQ       length of the list of primefactors including duplicates    
    Z         Input is not squarefree, so output Zero
  ^_1lPQ  if input is squarefree, output -1^(number of prime-factors)

3

MATL , 15 17 byte

tq?YftdAwn-1w^*

Ini menggunakan rilis saat ini (10.1.0) dari bahasa / kompiler.

Cobalah online!

Penjelasan

t         % implicit input. Duplicate that
q         % decrement by 1. Gives truthy (nonzero) if input exceeds 1
?         % if input exceeds 1, compute function. Otherwise leave 1 on the stack
  Yf      % vector of prime factors. Results are sorted and possibly repeated
  td      % duplicate and compute differences
  A       % true if all differences are nonzero
  w       % swap
  n       % number of elements in vector of prime factors, "x"
  -1w^    % -1^x: gives -1 if x odd, 1 if x even 
  *       % multiply by previously obtained true/false value, so non-square-free gives 0
          % implicitly end "if"
          % implicitly display stack contents

3

05AB1E , 8 byte, tidak bersaing

Sial, sekali lagi bug yang membuat kiriman saya tidak bersaing. Kode:

.p0K1›<P

Penjelasan:

.p        # Get the prime factorization exponents
  0K      # Remove all zeroes from the list
    1›    # Compare each element if greater than 1
      <   # Decrement on each element
       P  # Take the product

Menggunakan pengkodean CP-1252


tidak ada dalam ISO 8859-1 ...
ETHproduksi

1
@ EHProduk Heh? Encoding macam apa itu? Saya mendapatkannya dari situs ini .
Adnan

Saya percaya itu disebut Extended ASCII .
ETHproduk

@ETHproductions Terima kasih, saya telah mengedit posting :)
Adnan

@ Thomas Kwa Ahh, saya telah menemukannya. Ini adalah pengkodean CP-1252 .
Adnan

2

Pyth, 11

*{IPQ^_1lPQ

Suite uji

Ini mengalikan nilai boolean jika faktor prima kuadrat bebas oleh -1kekuatan jumlah faktor prima yang dimiliki angka tersebut.

Iadalah pemeriksaan invarian pada operator sebelumnya, yang di sini adalah {, yang merupakan operator unik.



2

Julia, 66 byte

n->(f=factor(n);any([values(f)...].>1)?0:length(keys(f))%2>0?-1:1)

Ini adalah fungsi lambda yang menerima integer dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel.

Tidak Disatukan:

function µ(n::Int)
    # Get the prime factorization of n as a Dict with keys as primes
    # and values as exponents
    f = factor(n)

    # Return 0 for non-squarefree, otherwise check the length of the list
    # of primes
    any([values(f)...] .> 1) ? 0 : length(keys(f)) % 2 > 0 ? -1 : 1
end

2

PARI / GP, 7 byte

moebius

Sayangnya möbiustidak tersedia. :)


2

Serius, 19 18 byte

,w;`iX1=`Mπ)l1&τD*

Cobalah online!

Penjelasan:

,w;`iXDY`Mπ)l1&τD*
,w;                push two copies of the full prime factorization of the input
                      (a list of [base, exponent] pairs)
   `    `M         map the following function:
    iX1=             flatten list, discard, equal to 1
                        (push 1 if exponent == 1 else 0)
          π)       product of list, push to bottom of stack
            1&     push 1 if the # of prime factors is even else 0
              τD   double and decrement (transform [0,1] to [-1,1])
                *  multiply

2

C # (.NET Core) , 86 73 72 65 byte

a=>{int b=1,i=1;for(;++i<=a;)b=a%i<1?(a/=i)%i<1?0:-b:b;return b;}

Cobalah online!

-13 byte: loop efisien, menambahkan variabel kembali (terima kasih kepada Kevin Cruijssen )
-1 byte: mengubah pengaturan b menjadi nol menjadi ternary dari if (terima kasih kepada Kevin Cruijssen )
-7 byte: diubah jika pernyataan untuk loop ke ternary (terima kasih kepada Peter Taylor dan Kevin Cruijssen )

Tidak Disatukan:

a => {
    int b = 1, i = 1;           // initialize b and i to 1

    for(; ++i <= a;)            // loop from 2 (first prime) to a
        b = a % i < 1 ?                     // ternary: if a is divisible by i
            ((a /= i) % i < 1 ? 0 : -b) :   // if true: set b to 0 if a is divisible by i squared, otherwise flip sign of b
            b;                              // if false: don't change b

    return b;                   // return b (positive for even numbers of primes, negative for odd, zero for squares)
}

1
73 byte saya telah berubah int b=1;for(int i=1;menjadi int b=1,i=1;for(;. Menghapus tanda {}kurung untuk loop. Mengubah keduanya a%i==0menjadi a%i<1. Mengubah b*=-1;ke b=-b;. Dan akhirnya mengubah return 0;ke b=0;.
Kevin Cruijssen

Ya, semua yang Anda sarankan terlihat benar. Saya sedikit khawatir ketika Anda mengatakan itu tidak benar, karena itu berarti kode asli saya juga salah! :)
Meerkat

1
Ya, maaf soal itu. :) 1 byte lagi ke golf btw adalah if(a%i<1)b=0;untuk b=a%i<1?0:b;.
Kevin Cruijssen

2
Sebenarnya, itu menghadap peningkatan yang mudah: b=-b;b=a%i<1?0:b;golf keb=a%i<1?0:-b;
Peter Taylor

1
Melanjutkan golf @ PeterTaylor di atas, Anda kemudian dapat mengubah if(a%i<1){a/=i;b=a%i<1?0:-b;}ke b=a%i<1?(a/=i)%i<1?0:-b:b;untuk menyimpan 3 byte lagi.
Kevin Cruijssen

1

GNU sed, 89 byte

#!/bin/sed -rf
s/.*/factor &/e
s/.*://
/\b([0-9]+) \1\b/!{
s/[0-9]+//g
s/$/1/
s/  //g
y/ /-/
}
s/ .*/0/


1

Microsoft Office Excel, versi Inggris, 196 byte

=IF(ROW()>=COLUMN(),IF(AND(ROW()=1,COLUMN()=1),1,IF(COLUMN()=1,
-SUM(INDIRECT(ADDRESS(ROW(),2)&":"&ADDRESS(ROW(),ROW()))),
IF(MOD(ROW(),COLUMN())=0,INDIRECT(ADDRESS(FLOOR(ROW()/COLUMN(),1),
1)),""))),"")

Rumus sel Excel yang akan dimasukkan dalam sel A1 hingga AX50.



1

Serius, 11 byte

Saran bermain golf diterima. Cobalah online!

;y;l0~ⁿ)π=*

Tidak melakukanolf

     Implicit input n.
;    Duplicate n.
y    Push a list of the distinct prime factors of n. Call it dpf.
;    Duplicate dpf.
l    Push len(dpf).
0~   Push -1.
ⁿ    Push (-1)**len(dpf).
)    Rotate (-1)**len(dpf) to BOS. Stack: dpf, n, (-1)**len(dpf)
π    Push product(dpf).
=    Check if product(dpf) == n.
      This is only true if n is squarefree.
*    Multiply (n is squarefree) by (-1)**len(dpf).
     Implicit return.

Solusi bagus =) (namun saya kira bahasa ini lebih muda dari pertanyaannya, bukan?)
flawr

@ flawr Rupanya jawabannya bekerja dengan baik di Seriously, dan saya tidak tahu kapan Sebenarnya pertama kali online, jadi saya beralih ke Seriously hanya untuk aman.
Sherlock9

1

Java 8, 72 68 65 byte

n->{int r=1,i=1;for(;++i<=n;)r=n%i<1?(n/=i)%i<1?0:-r:r;return r;}

-4 byte terima kasih @PeterTaylor .

Pelabuhan @ Meerkat's .NET C # answer , yang pertama kali saya mainkan sedikit lebih jauh, jadi pastikan untuk membesarkannya!

Cobalah online.

Penjelasan:

n->{                 // Method with integer as both parameter and return-type
  int r=1,           //  Result-integer, starting at 1
  i=1;for(;++i<=n;)  //  Loop `i` in the range [1, n]:
    r=n%i<1?         //   If `n` is divisible by `i`:
       (n/=i)        //    Divide `n` by `i` first
        %i<1?        //    And if `n` is still divisible by `i`:
         0           //     Change `r` to 0
        :            //    Else:
         -r          //     Swap the sign of `r` (positive to negative or vice-versa)
      :              //    Else:
       r;            //     Leave `r` unchanged
  return r;}         //  Return `r` as result

Lihat komentar saya tentang jawaban Meerkat.
Peter Taylor

@PeterTaylor Smart, terima kasih! Dan kemudian 3 byte lagi dapat disimpan dengan menggunakan r=n%i<1?(n/=i)%i<1?0:-r:r;.
Kevin Cruijssen

0

Javascript (ES6), 48 byte

f=(n,i=1)=>n-1?n%++i?f(n,i):(n/=i)%i?-f(n,i):0:1

Pertama-tama - ini adalah posting golf kode pertama saya sehingga saya bisa salah paham aturan sampai batas tertentu. Dalam pengajuan ini karakter terakhir ;dapat dihilangkan dan masih akan berfungsi tetapi saya bahkan tidak yakin apakah kode tersebut akan valid sesuai dengan spesifikasi ES6. Bagaimanapun, penjelasan singkat.

Pertama, saya akan menjelaskan sedikit ide; kami ambil n, dan kami coba membaginya dengan integer i. Jika itu dapat dibagi, maka kami melakukannya dan kami memeriksa apakah itu dapat dibagi ilagi. Jika itu masalahnya, maka kita perlu kembali 0. Kalau tidak, kita dapat mencoba yang lain i. Yang keren adalah, kita bisa mulai sajai=2 dan menambahkan saja 1setiap waktu, sehingga kita membagi semua faktor utama.

Jadi, kodenya bekerja seperti ini:

f=(n,i=1)=>                                           We will increase i by one at the start of
                                                         the function body, so default is 1
           n-1?                                       Check if n==1.
               n%++i?                                 If i isn't, increase i by 1, check if n
                                                         is divisible by i
                     f(n,i):                          if it isn't, we check the next i
                            (n/=i)%i?                 if it is, divide n by i, and check for
                                                         divisibility by i again
                                     -f(n,i):         if it not, then we flip the value to
                                                         account for the 1 and -1 depending on the
                                                         amount of factors
                                             0:       if it's divisible by i twice, done.
                                               1      if we're at 1, divided out all factors,
                                                         then we return 1. The line with
                                                         -f(n,i) will then take care of the sign

Jadi, itulah kiriman saya.


Selamat datang di situs ini. Saya tidak tahu js, tapi saya bisa memberi tahu Anda bahwa di sini kita tidak peduli dengan spesifikasi, hanya implementasi. Jadi, jika menghapus ;tidak merusaknya, tidak masalah dengan spesifikasi yang dapat Anda hapus.
Wheat Wizard

Senang mendengarnya! Saya akan menghapusnya;)
vrugtehagel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.