ฟังก์ชั่นMöbius


23

ฟังก์ชั่นMöbius

ฟังก์ชันMöbiusเป็นฟังก์ชันเชิงทฤษฎีที่สำคัญ

การส่งของคุณควรจะยอมรับเป็นจำนวนเต็มบวกและกลับค่าของฟังก์ชั่นMöbiusประเมินที่nn

คำนิยาม

ฟังก์ชันMöbiusμ (n) ถูกกำหนดดังนี้:

       |  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

nเรียกว่าsquarefreeถ้าเลขชี้กำลังของการแยกตัวประกอบเฉพาะของ n ทั้งหมดน้อยกว่าสองตัว (หรือมิฉะนั้น: ไม่มีค่าเฉพาะกำลังสองหารn)

กรณีทดสอบ

ที่นี่คุณสามารถเห็น 50 ค่าแรกของμ:

ภาพโดเมนสาธารณะจาก Wikipedia

ฟังก์ชันMöbiusคือหมายเลขลำดับA008683ใน OEIS

นี่คือ 77 ค่าแรก:

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

ค่าที่มากกว่านั้นสามารถตรวจสอบได้ใน Wolframalpha.comหรือในb-file ของ OEISตามที่ @ MartinBüttnerแนะนำ

คำตอบ:


15

Python 2, 48 ไบต์

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

รุ่นก่อนหน้า 51 ไบต์:

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

Möbius-ตีความ1,0,0,0,0...ลำดับ

ฟังก์ชั่นMöbiusมีคุณสมบัติที่ใดn>1ที่ฟังก์ชั่นของMöbius n's รวมตัวหารเป็น 0 ดังนั้นสำหรับn>1, μ(n)วณโดยกวนผลรวมของμ(k)สำหรับตัวหารที่เหมาะสมทั้งหมดของk nสำหรับผลลัพธ์คือn=11

รหัสนี้จะจัดการกับกรณีฐานโดยการเพิ่มพื้นส่วน1/nซึ่งจะช่วยให้1สำหรับn==1และ0อย่างอื่น

ขอบคุณเดนนิสที่ช่วยประหยัด 3 ไบต์ด้วยการจัดการแบบเรียกซ้ำที่ได้แรงบันดาลใจจากโครงสร้างที่คล้ายกันในความท้าทายนี้


13

เยลลี่ขนาด 7 ไบต์

รหัส:

ÆF>1’PS

คำอธิบาย:

Æ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

ตัวอย่างเช่นหมายเลข10 :

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

และผลใน1

ลองมันออนไลน์


-1 ไบต์: ÆFỊNPS(ไม่แน่ใจว่าเป็นบิวท์อินแล้ว แต่ตอนนี้ควรใช้ได้)
Erik the Outgolfer

10

Mathematica ขนาด 9 ไบต์

MoebiusMu

แน่นอนว่า Mathematica มีในตัว (และอาจจะถูกโจมตีโดยเจลลี่ต่อไป)


7

CJam, 18 15 ไบต์

WrimFz~\1&+f/:*

ความจริงที่ว่า CJam คืนค่า 1 ในการสร้างตัวประกอบเพื่อn = 1ทำให้สิ่งต่าง ๆ ยุ่งยากเล็กน้อย

ลองใช้ออนไลน์ | ชุดทดสอบ

ขอบคุณ @PeterTaylor สำหรับ1&+เคล็ดลับเรียบร้อยสำหรับการจัดการ 1 ราย

คำอธิบาย

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

สำหรับn > 1อาเรย์ที่ถูกแก้ไขนั้นเป็นเพียงอาเรย์แบบเลขชี้กำลัง ถ้าnเป็น squarefree ดังนั้น array คือ 1s ทั้งหมดซึ่งกลายเป็น -1s ทั้งหมดหลังจากการหาร มิฉะนั้นถ้า n มีตัวหารไพร์มสแควร์หลักจะมี 0 ที่ไหนสักแห่งหลังการหารให้ผลเป็น 0

สำหรับn = 1อาเรย์ที่ถูกแก้ไข[1] + [1]ซึ่งจะกลายเป็น[-1 -1]หลังจากการแบ่งให้ผลิตภัณฑ์ 1


ทางเลือก 16:

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

ใช้นี้#(ค้นหา) ในแต่ละ[base exponent]อาร์เรย์ที่จะมองหา 1 -1 -> 0, 0 -> 1, 1 -> -1แล้วแผนที่


6

Ruby, 65 + 7 = 72 62 + 7 = 69 ไบต์

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

+7 ไบต์สำหรับ-rprimeแฟล็ก

เรากำลังทำสิ่งนี้อย่างไร้เดียงสา:

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

ส่วน "เวทมนต์" จะส่งผลให้ 1 ถ้าจำนวนเป็นเลขคู่และ -1 นี่คือวิธี:

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

5

Pyth, 9 ไบต์

^_{IPQlPQ

คำอธิบาย:

^_{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.

ลองมันนี่


5

เขาวงกต , 87 ไบต์

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

ลองออนไลน์!

คำอธิบายสั้น ๆ

นี่คือพอร์ตของอัลกอริทึมที่ใช้ใน 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)

คำอธิบายยาว ๆ

ไพรเมอร์ปกติบนเขาวงกต:

  • เขาวงกตเป็นสแต็กและสองมิติโดยการดำเนินการเริ่มต้นที่ตัวละครแรกที่ได้รับการยอมรับ มีสแต็กสองสแต็กหลักและสแต็กเสริม แต่ผู้ประกอบการส่วนใหญ่จะทำงานกับสแต็กหลักเท่านั้น
  • ที่ทุกสาขาของเขาวงกตด้านบนสุดของสแต็กจะถูกตรวจสอบเพื่อพิจารณาว่าจะไปที่ไหนต่อไป ลบคือเลี้ยวซ้ายศูนย์ตรงไปข้างหน้าและบวกคือเลี้ยวขวา

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 ไบต์

numbers::moebius

คุณต้องมีแพ็คเกจตัวเลขติดตั้งในระบบของคุณ ...

แก้ไข: ง่ายกว่าถ้าฉันอ่านรายละเอียดอย่างเหมาะสม [ขอบคุณ @AlexA]


สิ่งนี้จะส่งคืนฟังก์ชันMöbiusที่ประเมินสำหรับแต่ละจำนวนเต็มตั้งแต่ 1 ถึงอินพุต แต่งานสำหรับความท้าทายนี้เป็นเพียงการประเมินฟังก์ชันMöbiusบนอินพุต
อเล็กซ์ A.

ตามแนวของคำตอบทางคณิตศาสตร์คุณสามารถทำได้เพียงnumbers::moebius16 ไบต์
อเล็กซ์ A.

3

Pyth , 16 ไบต์

?nl{PQlPQZ^_1lPQ

ลองออนไลน์!

คำตอบ Pyth ที่แท้จริงครั้งแรกของฉัน ข้อเสนอแนะชื่นชม! :)

คำอธิบาย

โซลูชันของฉันใช้ความจริงที่ว่าตัวเลขเป็นรูปสี่เหลี่ยมจัตุรัสถ้าปัจจัยหลักมีจำนวนไม่เกินหนึ่งครั้ง ถ้าอินพุทเป็นรูปสี่เหลี่ยมจัตุรัสMöbius-Function รับค่า -1 ^ (จำนวนของนายก)


?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ไบต์

tq?YftdAwn-1w^*

สิ่งนี้ใช้รีลีสปัจจุบัน (10.1.0)ของภาษา / คอมไพเลอร์

ลองออนไลน์!

คำอธิบาย

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 ไบต์, ไม่ใช่การแข่งขัน

Dammit เป็นข้อผิดพลาดอีกครั้งซึ่งทำให้การส่งของฉันไม่สามารถแข่งขันได้ รหัส:

.p0K1›<P

คำอธิบาย:

.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

ใช้การเข้ารหัส CP-1252


ไม่ได้อยู่ในมาตรฐาน ISO 8859-1 ...
ETHproductions

1
@ETHproductions เหอ แล้วการเข้ารหัสแบบไหนล่ะ? ฉันได้รับจากเว็บไซต์นี้
Adnan

ผมเชื่อว่ามันเรียกว่าASCII ขยาย
ETHproductions

@ETHproductions ขอบคุณฉันได้แก้ไขการโพสต์ :)
Adnan

@ThomasKwa Ahh ฉันได้พบแล้ว เป็นการเข้ารหัสCP-1252
Adnan

2

Pyth, 11

*{IPQ^_1lPQ

ชุดทดสอบ

สิ่งนี้จะคูณค่าบูลีนของหากปัจจัยสำคัญคือ squarefree ด้วย-1กำลังของจำนวนของปัจจัยสำคัญที่จำนวนนั้นมี

Iเป็นการตรวจสอบค่าคงที่ของตัวดำเนินการนำหน้าซึ่งนี่คือ{ซึ่งเป็นตัวดำเนินการที่ไม่ซ้ำใคร



2

Julia, 66 ไบต์

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

นี่คือฟังก์ชั่นแลมบ์ดาที่รับจำนวนเต็มและคืนค่าจำนวนเต็ม หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

Ungolfed:

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

อย่างจริงจัง19 18 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

,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 ไบต์

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

ลองออนไลน์!

-13 ไบท์: ลูปคล่องตัวเพิ่มตัวแปรส่งคืน (ขอบคุณKevin Cruijssen )
-1 ไบต์: เปลี่ยนการตั้งค่า b เป็นศูนย์เป็นไตรภาคจาก if (ขอบคุณKevin Cruijssen ) -7 ไบต์: เปลี่ยนถ้าคำสั่งในการวนซ้ำเป็นเทอมนารี
(ขอบคุณPeter TaylorและKevin Cruijssen )

Ungolfed:

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 ไบต์ฉันได้เปลี่ยนไปint b=1;for(int i=1; int b=1,i=1;for(;ลบ{}-brackets สำหรับลูป การเปลี่ยนแปลงทั้งการa%i==0 a%i<1เปลี่ยนไปb*=-1; b=-b;และในที่สุดก็มีการเปลี่ยนแปลงไปreturn 0; b=0;
Kevin Cruijssen

ใช่ทุกสิ่งที่คุณแนะนำดูถูกต้อง ฉันเคยกังวลเล็กน้อยเมื่อคุณพูดว่าไม่ถูกต้องเพราะนั่นหมายความว่ารหัสดั้งเดิมของฉันก็ผิดเช่นกัน! :)
Meerkat

1
ใช่ขอโทษด้วย :) เพิ่มเติม 1 ไบต์กอล์ฟครับเป็นไปif(a%i<1)b=0; b=a%i<1?0:b;
Kevin Cruijssen

2
ที่จริงแล้วสามารถมองเห็นการปรับปรุงได้ง่าย: b=-b;b=a%i<1?0:b;สนามกอล์ฟไปb=a%i<1?0:-b;
Peter Taylor

1
อย่างต่อเนื่องใน @ กอล์ฟ PeterTaylor ข้างต้นแล้วคุณสามารถเปลี่ยนif(a%i<1){a/=i;b=a%i<1?0:-b;}ไปb=a%i<1?(a/=i)%i<1?0:-b:b;เพื่อประหยัด 3 ไบต์
Kevin Cruijssen



1

Microsoft Office Excel เวอร์ชันอังกฤษ 196 ไบต์

=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)),""))),"")

สูตรเซลล์ Excel ที่จะป้อนในเซลล์ A1 ถึง AX50



1

จริงจัง 11 ไบต์

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

;y;l0~ⁿ)π=*

Ungolfing

     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.

วิธีการแก้ปัญหาที่ดี =) (ฉันเดา แต่ที่ภาษานี้เป็นน้องว่าคำถามมันเป็น)?
flawr

@flawr เห็นได้ชัดว่าคำตอบทำงานได้ดีเช่นเดียวกับใน Seriously และฉันไม่รู้ว่าจริง ๆ แล้วมาออนไลน์ครั้งแรกดังนั้นฉันจึงเปลี่ยนเป็น Seriously เพื่อความปลอดภัย
Sherlock9

1

Java 8, 72 68 65 ไบต์

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

-4 ไบต์ขอบคุณที่@PeterTaylor

พอร์ตของคำตอบ. NET C #ของ@ Meerkatซึ่งฉันตีกอล์ฟเพิ่มขึ้นอีกเล็กน้อยดังนั้นอย่าลืมโหวตให้เขา!

ลองออนไลน์

คำอธิบาย:

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

ดูความคิดเห็นของฉันเกี่ยวกับคำตอบของ Meerkat
Peter Taylor

@ PeterTaylor Smart ขอบคุณ! และแล้ว 3 r=n%i<1?(n/=i)%i<1?0:-r:r;ไบต์จะถูกบันทึกไว้โดยใช้
Kevin Cruijssen

0

Javascript (ES6), 48 ไบต์

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

ก่อนอื่น - นี่คือรหัสโพสต์กอล์ฟครั้งแรกของฉันดังนั้นฉันอาจเข้าใจผิดกฎไปบ้าง ในการส่งนี้เป็นตัวละครตัวสุดท้าย;อาจถูกตัดออกไปและมันจะยังคงใช้งานได้ แต่ฉันไม่แน่ใจว่ารหัสจะถูกต้องตามข้อกำหนด ES6 หรือไม่ อย่างไรก็ตามคำอธิบายสั้น ๆ

ก่อนอื่นฉันจะอธิบายแนวคิดเล็กน้อย เราใช้เวลาและเราพยายามที่หารด้วยจำนวนเต็มn iถ้ามันหารได้เราก็ทำเช่นนั้นและเราตรวจสอบว่ามันหารด้วยiอีกครั้งได้ไหม 0หากเป็นกรณีที่แล้วเราต้องกลับ มิฉะนั้นเราสามารถลองใหม่iได้ สิ่งที่ยอดเยี่ยมคือเราสามารถเริ่มต้นi=2และเพิ่มการเพิ่มได้1ทุกครั้งเพื่อที่เราจะแบ่งปัจจัยสำคัญทั้งหมด

ดังนั้นรหัสทำงานดังนี้:

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

ดังนั้นนั่นคือการส่งของฉัน


ยินดีต้อนรับสู่เว็บไซต์ ฉันไม่รู้ js แต่ฉันสามารถบอกคุณได้ว่าที่นี่เราไม่สนใจรายละเอียดเพียงการใช้งานเท่านั้น ดังนั้นหากการลบ;ไม่ทำลายมันก็ไม่สำคัญว่าคุณสามารถลบมันออกได้
ข้าวสาลีตัวช่วยสร้าง

ดีแล้วที่รู้! ฉันจะลบมันออก);
vrugtehagel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.