Как решить z = (((m / k) / j) / x) для x, оптимизируя z к 2ˣ

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

  • m количество доступной памяти в битах
  • k это разделительный фактор
  • 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, чтобы найти значения, но должен быть лучший способ.

1 ответ

Решение

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

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, но для этой конкретной задачи линейный поиск кажется нормальным.

Другие вопросы по тегам