Преобразование математической формулы в node.js - PullRequest
0 голосов
/ 27 августа 2018

Я хочу использовать математическую формулу, перечисленную здесь:

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) в формуле "Количество браслетов".

EDIT

вот окончательное решение:

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 голосов
/ 27 августа 2018

Вот окончательное решение, которое у меня работает правильно

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...