Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
53
Task/M-bius-function/Nim/m-bius-function.nim
Normal file
53
Task/M-bius-function/Nim/m-bius-function.nim
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
import std/[math, sequtils, strformat]
|
||||
|
||||
func getStep(n: int): int {.inline.} =
|
||||
result = 1 + n shl 2 - n shr 1 shl 1
|
||||
|
||||
func primeFac(n: int): seq[int] =
|
||||
var
|
||||
maxq = int(sqrt(float(n)))
|
||||
d = 1
|
||||
q: int = 2 + (n and 1) # Start with 2 or 3 according to oddity.
|
||||
|
||||
while q <= maxq and n %% q != 0:
|
||||
q = getStep(d)
|
||||
inc d
|
||||
if q <= maxq:
|
||||
let q1 = primeFac(n /% q)
|
||||
let q2 = primeFac(q)
|
||||
result = concat(q2, q1, result)
|
||||
else:
|
||||
result.add(n)
|
||||
|
||||
func squareFree(num: int): bool =
|
||||
let fact = primeFac num
|
||||
|
||||
for i in fact:
|
||||
if fact.count(i) > 1:
|
||||
return false
|
||||
|
||||
return true
|
||||
|
||||
func mobius(num: int): int =
|
||||
if num == 1: return num
|
||||
|
||||
let fact = primeFac num
|
||||
|
||||
for i in fact:
|
||||
## check if it has a squared prime factor
|
||||
if fact.count(i) == 2:
|
||||
return 0
|
||||
|
||||
if num.squareFree:
|
||||
if fact.len mod 2 == 0:
|
||||
return 1
|
||||
else:
|
||||
return -1
|
||||
|
||||
when isMainModule:
|
||||
echo "The first 199 möbius numbers are:"
|
||||
|
||||
for i in 1..199:
|
||||
stdout.write fmt"{mobius(i):4}"
|
||||
if i mod 20 == 0:
|
||||
echo "" # print newline
|
||||
Loading…
Add table
Add a link
Reference in a new issue