|
|
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Сегодня встретил в книге "Алгоритмические трюки для программистов" Генри Уоренна формулу в название топа(и не только эту). Доказательства не встретил. Пытался найти в интернете, не нашёл. На мой взгляд, это утверждение не очевидно, потому доказал сам. 1. Можно ли так доказывать? 2. Как бы вы доказали ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 11:26 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
где p - младший индекс битовой последовательности равный 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 11:28 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercury, x^p ?!!! может 2^p?!!! я сужу так... если у нас есть операция and (логическое и), то результат операции будет меньше любого из её операндов (аргументов). потому x&(что угодно)=x^p имеет смысл (решение) только тогда, когда p=1 или x<1. В любом другом случае данная формула не сойдётся. А доказывать... хм )) Как математически доказать, я ещё не знаю... Но давайте рассуждать логически (ведь у нас логические операции ). Итак, x&(-x)=1^p; Как мы помним -x=^x+1... так и запишем: x&(^x+1)=1^p; операция +1 - это ничто иное, как инверсия всех битов до первого нуля включительно. потому ^x+1 - это инверсия всех битов с номером больше p, где p - это порядковый номер первой битовой единицы в числе x. при выполнении операции and с такой парой чисел (там где все биты кроме первых p являются инверсированы), мы получаем число обрезанное именно по бит p. А учитывая, что все биты до бита p по условию равны нулю, то такое обрезанное число будет 2^p P.S. Точно требуется математическое доказательство? Или на уровне понимания как это происходит будет достаточно? P.P.S. Если надо именно доказательство, тогда не врите ))) Не просто в книжке увидели... а где-то задали :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 13:02 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Програмёр, да конечно, 2^p. Очепятка. Нет, никто не задавал, не вру. Мне просто это нравится ПрограмёрP.S. Точно требуется математическое доказательство? Или на уровне понимания как это происходит будет достаточно? Я просто встретил это в книге, и не только эту формулу. Но это не доказывалось. И это не очевидно. Искал в интернете, ничего не нашёл. Потому доказал сам. Мне было интересно как проводятся строгие доказательства в программировании, и как доказали бы другие участники. Вот и спросил ;) Как это происходит я полностью понимаю. Спасибо за ваши рассуждения))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 13:14 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЗдравствуйте. Сегодня встретил в книге "Алгоритмические трюки для программистов" Генри Уоренна формулу в название топа(и не только эту). Доказательства не встретил. Пытался найти в интернете, не нашёл. На мой взгляд, это утверждение не очевидно, потому доказал сам. 1. Можно ли так доказывать? 2. Как бы вы доказали ? 2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать. Если перебор - это не комильфо, то я бы в coq или agda'е доказывал. Нехай компутер проверяет, что я нигде не опростоволосился во время мат выкладок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 15:10 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercuryМне было интересно как проводятся строгие доказательства в программировании В простейшем случае (типа того что ты привел) еще можно что-то подоказывать, в более сложных - устанешь это делать. Глубокой математики в среднестатиститечой программе немного, зато много всяких условий, циклов и т.д. и т.п., которые используют базовые алгоритмы (уже доказанные) Поэтому обычно пишется так как считаешь правильным (согласно придуманному тобой алгоритму), а потом прогоняешь через свой код тестовые наборы входных данных и сверяешь с заранее известными результатами. Чем больше тестов - тем выше вероятность что код не содержит ошибок. Чем лучше ты понимаешь где критические места твоего алгоритма, тем качественнее тестирование получается. Подробнее в гугле смотри Но 100% надежности все равно не достичь, поэтому в программе обязательно должна быть обработка ошибок и контроль выхода значений за пределы (там где пределы известны). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 16:15 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Strangecat 2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать. А если бы вам нужно было доказать это для 256-битной последовательности ? Dima T, может мне поискать примеры доказательств где-нибудь в теории языков программирования ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 02:22 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercuryStrangecat 2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать. А если бы вам нужно было доказать это для 256-битной последовательности ? Зацикливаешь генератор случайных 256-битных последовательностей и гоняешь пока ошибка не найдется или пока не надоест )) Конкретно эта формула очевидна, например x = 12 или в двоичной 1100 отрицательное число это инверсия положительного +1. т.е. 0011 + 1 = 0100 число & инверсия всегда 0. т.к. только 1&1 = 1 +1 - менять все единицы на нули начиная с младшего разряда пока не встретится 0, его поменять на 1. остальные старшие разряды не будут изменены никогда (правила сложения столбиком, 2-й класс) В итоге имеем что в положительном и отрицательном значении в 1 установлен только один разряд, младший единичный из исходного числа. SashaMercuryDima T, может мне поискать примеры доказательств где-нибудь в теории языков программирования ? Нет их там. Метод научного тыка основной способ доказательства. Вся научность заключается в том что понимая особенности и ограничения используемых алгоритмов даешь для проверки околограничные входные данные и проверяешь что на них работает правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 09:26 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercuryStrangecat 2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать. А если бы вам нужно было доказать это для 256-битной последовательности ? Dima T, может мне поискать примеры доказательств где-нибудь в теории языков программирования ? Нужно доказать, что всегда будет так, или доказать математически данный факт? Если надо доказать что всегда будет так - в теме уже есть ответ. Могу привести несколько его более строгих вариаций (вчера сидел на досуге писал). То есть там расписано что и откуда берётся на уровне логических операций (с заменой одной операции на другую равносильную ей... ну типа x+1 = x xor (2^p-1)). Если же надо математически то же самое доказать, то это другая тема! (правильно!!! без каких либо умозаключений, присущих именно данному варианту... ведь в целом например +1 мы не можем заменить на xor... но в данном случае условие задачи нам это позволяет сделать). Суть такова - если человек занимается программированием, и в определённый момент ему нужно решить квадратное уравнение, ему не обязательно знать откуда берётся дискриминант... ему главное уметь его посчитать ))) В данной задачи то же самое. Рассматривая логические операции, мне не обязательно уметь доказывать математически, что это превратиться в это... мне главное понимать в каких случаях это произойдёт и почему (что бы учесть все исключения). Потому этот форум не для математических доказательств :). С такой темой, как по мне, лучше обратиться на математический форум... там обычно сидят такие "маньяки", которые любят всё математически доказывать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 10:19 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Сабж напомнил другую задачу - как проверить, что в целочисленной беззнаковой переменной записана степень двойки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 15:38 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Яростный МечСабж напомнил другую задачу - как проверить, что в целочисленной беззнаковой переменной записана степень двойки. в соседней теме уже описано ))) x&(x-1) сбросит первую найденную 1 в 0. потому, if(x&(x-1)==0){степень двойки} :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 16:12 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercuryНа мой взгляд, это утверждение не очевидно, потому доказал сам. А на мой взгляд, это утверждение очевидно неверно для x=0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 17:39 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Генри Уоррен пишет. Чтобы выделить в слове крайний справа единичный бит (например 01011000 => 00001000, если такого бита нет возвращает 0), используется формула: x & (-x) Думаю что для доказательства этого нужна бумага и ручка и понимание того как работает "дополнительный код" для представления отрицательных чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 17:57 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
А я думал что 0&anyth=0;) Хотя конечно нужно вынести этот случай в данной формулировке и описать его, ибо мало ли что я думал. В оригинале говорится о индексе первого байта равного 1, потому к изначальной формулировке все хорошо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 18:06 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
softwarerА на мой взгляд, это утверждение очевидно неверно для x=0. ТЗ читать не умеем? :) 0 не попадает в диапазон допустимых значений: SashaMercuryгде p - младший индекс битовой последовательности равный 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 18:50 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Dima TТЗ читать не умеем? :) Скорее патчи к ТЗ. Я как-то не догадался, что оно продолжается после первого поста, решил, что это уже комментарий топикстартера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 19:25 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercuryStrangecat 2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать. А если бы вам нужно было доказать это для 256-битной последовательности ? Dima T, может мне поискать примеры доказательств где-нибудь в теории языков программирования ? Вот тебе формальное доказательство на agda. Оно является доказательством для 256 битных чисел и примеров формализма "где-нибудь в теории языков программирования". CDTP Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. Кратко оно строится следующим образом: вначале определяем бинарные N-битные числа, затем определяем бинарное И, унарный минус, операцию по изъятию LSB (которая оставляет только младший установленный бит), после этого в main-theorem и доказываем что x & -x = LSB(x). Суть доказательства в индукции по битам. Для 0-битного числа доказательство тривиально, далее рассматриваются 2 ситуации в зависимости от значения следующего бита и используем определения унарного минуса и and. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2014, 09:16 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Strangecat Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2014, 09:19 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
Strangecat, спасибо. К сожалению мои знания об этом языке ограничиваются очень немногим. Потому я не смогу качественно изучить ваш код. А не могли бы вы сами показать ваши рассуждения методом математической индукции. Пока не представляю как это будет выглядеть (сам метод понятен, как его грамотно приложить сюда не до конца понятно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 04:43 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SSА не могли бы вы сами показать ваши рассуждения методом математической индукции. В смысле доказать это "на бумаге". Ваша фраза Strangecat Для 0-битного числа доказательство тривиально, далее рассматриваются 2 ситуации в зависимости от значения следующего бита и используем определения унарного минуса и and. 0-битное число ? Для меня метод матиндукции это 1. Стартовая позиция, для неё утверждение истинно 2. Делаем предположение что для i это истина, и исходя из этого предположения доказываем для i+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 06:04 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercurySSА не могли бы вы сами показать ваши рассуждения методом математической индукции. В смысле доказать это "на бумаге". Спасибо, что не на абаке. На бумаге нет контроля за ошибками. Ещё в них можно "докажи формально этот кусок за меня" сделать. На бумаге нельзя. Можно написать "очевидно", но это ерунды кусок, а не формализм. Програмёр и Dima T уже привели не польностью формальные наброски доказательств. SashaMercuryStrangecat Для 0-битного числа доказательство тривиально, далее рассматриваются 2 ситуации в зависимости от значения следующего бита и используем определения унарного минуса и and. 0-битное число ? Да, именно. Вообще говоря, любое утверждение для элементов пустого множества истинно. Множество 0-битных чисел пусто. Круто, "x & -x = lsb(x)" для 0 битов верно, поэтому его можно использовать как базу. Именно поэтому доказательство для 0 бит тривиально. (Можно начать и с 1-битного числа, но зачем усложнять себе жизнь?) Для меня метод матиндукции это 1. Стартовая позиция, для неё утверждение истинно 2. Делаем предположение что для i это истина, и исходя из этого предположения доказываем для i+1 Ну круто, в конкретном случае удобно индукцировать по количеству бит, а не по числам от 0 до (2^N)-1. Может по числам тоже можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 09:32 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Требуется найти m=2^p, где p - младший ненулевой бит целого n, не равного нулю. Имеем: n содержит p-1 нулей в младших разрядах, 1 в разряде p. Рассмотрим двоичную запись числа n-1. Очевидно, она содержит p-1 единиц в младших разрядах, 0 в разряде p и неизменные разряды старше p. Тогда число not(n-1) содержит p-1 нулей в младших разрядах, 1 в разряде p и инвертированные разряды старше p. Значит, искомое m=n and not (n-1). Заметим, что для чисел в дополнительном коде по определению верно: -i=1+not i, или not i=(-i) - 1. Значит, m=n and not (n-1)=n and (-(n-1)-1)=n and (-n). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 11:07 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
В принципе, доказательство проще сразу провести для дополнительного кода. Но если это кажется сложным или неочевидным, то годится то, что я привел выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 11:19 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
угу, если принять что -n = not (n-1) = not (n) +1 все это учат в самом начале интересно, а есть другие способы представления отрицательных чисел ... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 12:35 |
|
||
|
Доказательство формулы x&(-x)=x^p
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)угу, если принять что -n = not (n-1) = not (n) +1 все это учат в самом начале интересно, а есть другие способы представления отрицательных чисел ... ? А зачем другие представления, если приведены самые простые (в частности not(n)+1 - самое простое представление). другие можно придумать.. вот только зачем (двумя действиями как тут ограничиться не получится) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 13:00 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38631232&tid=1341378]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
136ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 433ms |

| 0 / 0 |
