Как решить z = (((m / k) / j) / x) для x, оптимизируя z к 2ˣ - PullRequest
0 голосов
/ 12 февраля 2019

Скажем, у меня есть эти переменные:

  • m - это объем памяти, доступный в битах
  • *, 1007 * - это коэффициент деления
  • j - это еще один делительный коэффициент, который хранится как отдельная переменная, а не объединяется с k
  • x - это значение, которое мы хотим выяснить.
  • z - это значение, которое мыхочу быть ближайшим к 2^x

Тогда у нас есть

let z = (((m / k) / j) / x)

Так, например, скажем, у нас есть:

  • m = 2000000
  • k = 5
  • j = 10
  • x = ?
  • z = ?

Тогда мы имеем

let z = ((2000000 / 5) / 10) / x

Я хотел бы выяснить, что дает x, что z должно быть как можно ближе к 2 с силой x, насколько это возможно.В настоящее время я делаю это, просто вставляя числа и пытаясь приблизить их к соответствию.Но мне интересно, какой общий способ программно решить эту проблему.Но, например, я мог бы попробовать подключить x = 10, что равно:

4000 = ((2000000 / 5) / 10) / 10

Затем 2¹⁰ = 1024, что прилично близко к 4000, но я не знаю, что будет ближе.Попытка x = 11 дает:

3636 = ((2000000 / 5) / 10) / 11

и 2¹¹ = 2048, поэтому x = 11 является лучшим решением.

Интересно, как я могу программно решить эту проблему.Я пытался вычленить это уравнение, но с тех пор, как я это сделал, прошло довольно много времени, поэтому я не знаю.

z = (((m / k) / j) / x)
x * z = (m / k) / j
j * (x * z) = m / k
k * (j * (x * z)) = m
...

Немного потерян, сейчас не знаю, как до него добратьсяиз этого:

f(k, j) = ... => [ x, z ]

Вообще я пытаюсь выяснить, как решить уравнение программно.Просто просмотр реализации позволил бы мне понять, не делая ее слишком широкой.

То, что я делал в настоящее время, - это в основном отладчик и ввод некоторого JavaScript, чтобы найти значения, но должен быть лучший способ.

enter image description here

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете выполнить итеративный поиск :

x = 1
best_error = infinity
best_x = 0
while True:
   z = (((m / k) / j) / x)
   error = abs(z - pow(2,x))
   if error > best_error
      return best_x
   best_error = error
   best_x = x
   x = x+1

Для других отношений есть более эффективные способы выбора следующего x, но для этой конкретной задачи линейный поиск кажется подходящим.

...