将数学公式转换为node.js

时间:2018-08-27 13:10:02

标签: javascript node.js math formula bioinformatics

我想使用下面列出的数学公式:

https://en.wikipedia.org/wiki/Necklace_(combinatorics)#Number_of_bracelets

在node.js中计算出我可以使用n个字符生成的k个长度的唯一环序列的总数,从而允许重复并忽略镜像序列

此公式还需要计算前面的公式,如下所示:

https://en.wikipedia.org/wiki/Necklace_(combinatorics)#Number_of_necklaces

此“项链数量”公式的结果在“手镯数量”公式中用作Nk(n)

编辑

这是最终解决方案:

const phi = require('number-theory').eulerPhi
const divisors = require('number-theory').divisors

let n = 6,
  k = 5,
  sum = (arr, func) => arr.reduce( (acc, n) => acc + func(n), 0),
  divisorsArray = divisors(n),
  necklaces = (1/n) * sum(divisorsArray, (d) => phi(d) * k ** (n/d))

let bracelets = (n % 2) ?
  (necklaces/2) + 0.5 * (k ** ((n+1)/2)) :
  (necklaces/2) + 0.25 * (k+1) * (k ** (n/2))

1 个答案:

答案 0 :(得分:1)

这是最终的解决方案,对我来说是正确的

const phi = require('number-theory').eulerPhi
const divisors = require('number-theory').divisors

let n = 6,
    k = 5,
    sum = (arr, func) => arr.reduce( (acc, n) => acc + func(n), 0),
    divisorsArray = divisors(n),
    necklaces = (1/n) * sum(divisorsArray, (d) => phi(d) * k ** (n/d))

let bracelets = (n % 2) ?
    (necklaces/2) + 0.5 * (k ** ((n+1)/2)) :
    (necklaces/2) + 0.25 * (k+1) * (k ** (n/2))