powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Доказательство формулы x&(-x)=x^p
25 сообщений из 26, страница 1 из 2
Доказательство формулы x&(-x)=x^p
    #38628587
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Сегодня встретил в книге "Алгоритмические трюки для программистов" Генри Уоренна формулу в название топа(и не только эту). Доказательства не встретил. Пытался найти в интернете, не нашёл. На мой взгляд, это утверждение не очевидно, потому доказал сам.
1. Можно ли так доказывать?
2. Как бы вы доказали ?
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38628590
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где p - младший индекс битовой последовательности равный 1.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38628740
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Если надо именно доказательство, тогда не врите ))) Не просто в книжке увидели... а где-то задали :).
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38628764
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр, да конечно, 2^p. Очепятка.
Нет, никто не задавал, не вру. Мне просто это нравится

ПрограмёрP.S. Точно требуется математическое доказательство? Или на уровне понимания как это происходит будет достаточно?

Я просто встретил это в книге, и не только эту формулу. Но это не доказывалось. И это не очевидно. Искал в интернете, ничего не нашёл. Потому доказал сам. Мне было интересно как проводятся строгие доказательства в программировании, и как доказали бы другие участники. Вот и спросил ;)
Как это происходит я полностью понимаю.

Спасибо за ваши рассуждения)))
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38629013
Strangecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте. Сегодня встретил в книге "Алгоритмические трюки для программистов" Генри Уоренна формулу в название топа(и не только эту). Доказательства не встретил. Пытался найти в интернете, не нашёл. На мой взгляд, это утверждение не очевидно, потому доказал сам.
1. Можно ли так доказывать?
2. Как бы вы доказали ?

2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать.

Если перебор - это не комильфо, то я бы в coq или agda'е доказывал. Нехай компутер проверяет, что я нигде не опростоволосился во время мат выкладок.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38629117
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне было интересно как проводятся строгие доказательства в программировании
В простейшем случае (типа того что ты привел) еще можно что-то подоказывать, в более сложных - устанешь это делать. Глубокой математики в среднестатиститечой программе немного, зато много всяких условий, циклов и т.д. и т.п., которые используют базовые алгоритмы (уже доказанные) Поэтому обычно пишется так как считаешь правильным (согласно придуманному тобой алгоритму), а потом прогоняешь через свой код тестовые наборы входных данных и сверяешь с заранее известными результатами. Чем больше тестов - тем выше вероятность что код не содержит ошибок. Чем лучше ты понимаешь где критические места твоего алгоритма, тем качественнее тестирование получается.
Подробнее в гугле смотри
Но 100% надежности все равно не достичь, поэтому в программе обязательно должна быть обработка ошибок и контроль выхода значений за пределы (там где пределы известны).
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38629604
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strangecat 2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать.

А если бы вам нужно было доказать это для 256-битной последовательности ?

Dima T, может мне поискать примеры доказательств где-нибудь в теории языков программирования ?
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38629723
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryStrangecat 2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать.

А если бы вам нужно было доказать это для 256-битной последовательности ?
Зацикливаешь генератор случайных 256-битных последовательностей и гоняешь пока ошибка не найдется или пока не надоест ))

Конкретно эта формула очевидна, например x = 12 или в двоичной 1100
отрицательное число это инверсия положительного +1. т.е. 0011 + 1 = 0100
число & инверсия всегда 0. т.к. только 1&1 = 1
+1 - менять все единицы на нули начиная с младшего разряда пока не встретится 0, его поменять на 1. остальные старшие разряды не будут изменены никогда (правила сложения столбиком, 2-й класс)
В итоге имеем что в положительном и отрицательном значении в 1 установлен только один разряд, младший единичный из исходного числа.

SashaMercuryDima T, может мне поискать примеры доказательств где-нибудь в теории языков программирования ?
Нет их там. Метод научного тыка основной способ доказательства. Вся научность заключается в том что понимая особенности и ограничения используемых алгоритмов даешь для проверки околограничные входные данные и проверяешь что на них работает правильно.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38629806
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryStrangecat 2) Мне лень. Если бы потребовалось, я бы тупо использовал многопоточный перебор для всех 32 битных чисел. Времени написать и выполнить скрипт потребуется меньше, чем формально доказать.

А если бы вам нужно было доказать это для 256-битной последовательности ?

Dima T, может мне поискать примеры доказательств где-нибудь в теории языков программирования ?

Нужно доказать, что всегда будет так, или доказать математически данный факт?
Если надо доказать что всегда будет так - в теме уже есть ответ. Могу привести несколько его более строгих вариаций (вчера сидел на досуге писал). То есть там расписано что и откуда берётся на уровне логических операций (с заменой одной операции на другую равносильную ей... ну типа x+1 = x xor (2^p-1)).

Если же надо математически то же самое доказать, то это другая тема! (правильно!!! без каких либо умозаключений, присущих именно данному варианту... ведь в целом например +1 мы не можем заменить на xor... но в данном случае условие задачи нам это позволяет сделать).

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

В данной задачи то же самое. Рассматривая логические операции, мне не обязательно уметь доказывать математически, что это превратиться в это... мне главное понимать в каких случаях это произойдёт и почему (что бы учесть все исключения).

Потому этот форум не для математических доказательств :). С такой темой, как по мне, лучше обратиться на математический форум... там обычно сидят такие "маньяки", которые любят всё математически доказывать :)
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38630301
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сабж напомнил другую задачу - как проверить, что в целочисленной беззнаковой переменной записана степень двойки.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38630356
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечСабж напомнил другую задачу - как проверить, что в целочисленной беззнаковой переменной записана степень двойки.

в соседней теме уже описано ))) x&(x-1) сбросит первую найденную 1 в 0.
потому, if(x&(x-1)==0){степень двойки}

:)
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38630486
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНа мой взгляд, это утверждение не очевидно, потому доказал сам.
А на мой взгляд, это утверждение очевидно неверно для x=0.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38630502
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Генри Уоррен пишет.

Чтобы выделить в слове крайний справа единичный бит (например 01011000 => 00001000,
если такого бита нет возвращает 0), используется формула:

x & (-x)
Думаю что для доказательства этого нужна бумага и ручка и понимание того
как работает "дополнительный код" для представления отрицательных чисел.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38630513
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я думал что 0&anyth=0;) Хотя конечно нужно вынести этот случай в данной формулировке и описать его, ибо мало ли что я думал. В оригинале говорится о индексе первого байта равного 1, потому к изначальной формулировке все хорошо
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38630542
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerА на мой взгляд, это утверждение очевидно неверно для x=0.
ТЗ читать не умеем? :)
0 не попадает в диапазон допустимых значений:
SashaMercuryгде p - младший индекс битовой последовательности равный 1.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38630548
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТЗ читать не умеем? :)
Скорее патчи к ТЗ. Я как-то не догадался, что оно продолжается после первого поста, решил, что это уже комментарий топикстартера.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38631231
Strangecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
module bin where

open import Data.Nat

open import Relation.Binary.PropositionalEquality 

{- \bn is too awkward to type, so let's define an alias -}

Nat = &#8469;


-- Main data type of the day : binary number of N bits

data Binnum : Nat -> Set where
  eod : Binnum zero
  b0 : {n : Nat} -> Binnum n -> Binnum (suc n)
  b1 : {n : Nat} -> Binnum n -> Binnum (suc n)


-- bzero n = n bits of zero
bzero : (n : Nat) -> Binnum n
bzero zero = eod
bzero (suc n) = b0 (bzero n)

-- bzero n = n bits of 1
ball : (n : Nat) -> Binnum n
ball zero = eod
ball (suc n) = b1 (ball n)

-- bone : 1 in binary
bone : (n : Nat) -> Binnum n
bone zero = eod
bone (suc n) = b1 (bzero n)

-- invert all bits
invert : {n : Nat} -> Binnum n -> Binnum n
invert eod = eod
invert (b0 a) = b1 (invert a)
invert (b1 a) = b0 (invert a)

-- n + 1 % (2^n)
bsuc : {n : Nat} -> Binnum n -> Binnum n
bsuc eod = eod
bsuc (b0 n) = b1 n
bsuc (b1 n) = b0 (bsuc n)


-- For  testing
-- Let's check that suc is actually working

b0x0 = (b0 (b0 (b0 (b0 eod))))
b0x1 = (b1 (b0 (b0 (b0 eod))))
b0x2 = (b0 (b1 (b0 (b0 eod))))
b0x3 = (b1 (b1 (b0 (b0 eod))))
b0x4 = (b0 (b0 (b1 (b0 eod))))
b0x5 = (b1 (b0 (b1 (b0 eod))))
b0x6 = (b0 (b1 (b1 (b0 eod))))
b0x7 = (b1 (b1 (b1 (b0 eod))))
b0x8 = (b0 (b0 (b0 (b1 eod))))
b0x9 = (b1 (b0 (b0 (b1 eod))))
b0xA = (b0 (b1 (b0 (b1 eod))))
b0xB = (b1 (b1 (b0 (b1 eod))))
b0xC = (b0 (b0 (b1 (b1 eod))))
b0xD = (b1 (b0 (b1 (b1 eod))))
b0xE = (b0 (b1 (b1 (b1 eod))))
b0xF = (b1 (b1 (b1 (b1 eod))))

test_suc0 : (bsuc b0x0) &#8801; (b0x1)
test_suc0 = refl

test_suc1 : (bsuc b0x1) &#8801; (b0x2)
test_suc1 = refl

test_suc2 : (bsuc b0x2) &#8801; (b0x3)
test_suc2 = refl

test_suc3 : (bsuc b0x3) &#8801; (b0x4)
test_suc3 = refl

test_suc4 : (bsuc b0x4) &#8801; (b0x5)
test_suc4 = refl

test_suc5 : (bsuc b0x5) &#8801; (b0x6)
test_suc5 = refl

test_suc6 : (bsuc b0x6) &#8801; (b0x7)
test_suc6 = refl

test_suc7 : (bsuc b0x7) &#8801; (b0x8)
test_suc7 = refl

test_suc8 : (bsuc b0x8) &#8801; (b0x9)
test_suc8 = refl

test_suc9 : (bsuc b0x9) &#8801; (b0xA)
test_suc9 = refl

test_sucA : (bsuc b0xA) &#8801; (b0xB)
test_sucA = refl

test_sucB : (bsuc b0xB) &#8801; (b0xC)
test_sucB = refl

test_sucC : (bsuc b0xC) &#8801; (b0xD)
test_sucC = refl

test_sucD : (bsuc b0xD) &#8801; (b0xE)
test_sucD = refl

test_sucE : (bsuc b0xE) &#8801; (b0xF)
test_sucE = refl

test_sucF : (bsuc b0xF) &#8801; (b0x0)
test_sucF = refl


-- Now let's prove that one is a successor of zero
bone-is-suc0 : (n : Nat) -> (bsuc (bzero n)) &#8801; (bone n)
bone-is-suc0 zero = refl
bone-is-suc0 (suc n) = refl

-- Main auxfunction of the day: (l1 &#8801; l2) -> (f l1 &#8801; f l2)
f-equal : {LHS RHS : Set} -> (f : LHS -> RHS) -> (l1 : LHS) -> (l2 : LHS) -> (l1 &#8801; l2) -> (f l1 &#8801; f l2)
f-equal f .l2 l2 refl = refl


-- Let's prove that overflow resets all bits to 0
overflow-to-zero : (n : Nat) -> (bsuc (ball n)) &#8801; (bzero n)
overflow-to-zero zero = refl
overflow-to-zero (suc n) = f-equal b0 (bsuc (ball n)) (bzero n) (overflow-to-zero n)


-- Define xor
xor : {n : Nat} -> Binnum n -> Binnum n -> Binnum n
xor eod b = eod
xor (b0 a) (b0 b) = b0 (xor a b)
xor (b1 a) (b0 b) = b1 (xor a b)
xor (b0 a) (b1 b) = b1 (xor a b)
xor (b1 a) (b1 b) = b0 (xor a b)

-- Test that a ^ 0 = a
xor-zero : (n : Nat) -> (a : Binnum n) -> (xor a (bzero n)) &#8801; a
xor-zero .0 eod = refl
xor-zero .(suc n) (b0 {n} a) = f-equal b0 (xor a (bzero n)) a (xor-zero n a)
xor-zero .(suc n) (b1 {n} a) = f-equal b1 (xor a (bzero n)) a (xor-zero n a)

-- Test that a ^ 0xfffff...ffff = a 
xor-ball : (n : Nat) -> (a : Binnum n) -> (xor a (ball n)) &#8801; (invert a)
xor-ball .0 eod = refl
xor-ball .(suc n) (b0 {n} a) = f-equal b1 (xor a (ball n)) (invert a) (xor-ball n a)
xor-ball .(suc n) (b1 {n} a) = f-equal b0 (xor a (ball n)) (invert a) (xor-ball n a)


-- Define plus (which is not needed per se, but it's used to prove correctness of unary minus)
bplus : {n : Nat} -> Binnum n -> Binnum n -> Binnum n
bplus eod eod = eod
bplus (b0 a) (b0 b) = b0 (bplus a b)
bplus (b0 a) (b1 b) = b1 (bplus a b)
bplus (b1 a) (b0 b) = b1 (bplus a b)
bplus (b1 a) (b1 b) = b0 (bplus (bsuc a) b)



-- While we are at it, let's prove that a+0 = a
bplus-zero-r : (n : Nat) -> (a : Binnum n) -> bplus a (bzero n) &#8801; a
bplus-zero-r .0 eod = refl
bplus-zero-r .(suc n) (b0 {n} a) = f-equal b0 (bplus a (bzero n)) a (bplus-zero-r n a)
bplus-zero-r .(suc n) (b1 {n} a) = f-equal b1 (bplus a (bzero n)) a (bplus-zero-r n a)

-- and that a + 1 is successor of a
bplus-one-r : (n : Nat) -> (a : Binnum n) -> (bplus a (bone n)) &#8801; (bsuc a)
bplus-one-r .0 eod = refl
bplus-one-r .(suc n) (b0 {n} a) = f-equal b1 (bplus a (bzero n)) a (bplus-zero-r n a)
bplus-one-r .(suc n) (b1 {n} a) = f-equal b0 (bplus (bsuc a) (bzero n)) (bsuc a) (bplus-zero-r n (bsuc a)) 



-- Define and
band : {n : Nat} -> Binnum n -> Binnum n -> Binnum n
band eod b = eod
band (b0 a) (b0 b) = b0 (band a b)
band (b0 a) (b1 b) = b0 (band a b)
band (b1 a) (b0 b) = b0 (band a b)
band (b1 a) (b1 b) = b1 (band a b)

-- Prove that a & a = a
band-xx : {n : Nat} -> (a : Binnum n) -> (band a a) &#8801; a
band-xx eod = refl
band-xx (b0 a) = f-equal b0 (band a a) a (band-xx a)
band-xx (b1 a) = f-equal b1 (band a a) a (band-xx a)

-- Prove that a & ~a = 0. 
-- We'll need this proof later.
band-invert : (n : Nat) -> (a : Binnum n) -> band a (invert a) &#8801; bzero n
band-invert .0 eod = refl
band-invert .(suc n) (b0 {n} a) = f-equal b0 (band a (invert a)) (bzero n) (band-invert n a)
band-invert .(suc n) (b1 {n} a) = f-equal b0 (band a (invert a)) (bzero n) (band-invert n a) 


-- Negatives are hard. 
buminus : {n : Nat} -> Binnum n -> Binnum n
buminus a =  bsuc (invert a)

-- So let's proof that it's actually unary minus by proving
-- -a + a = 0
buminus-is-correct : (n : Nat) ->  (a : Binnum n) -> (bplus (buminus a) a) &#8801; (bzero n)
buminus-is-correct .0 eod = refl
buminus-is-correct .(suc n) (b0 {n} a) = f-equal b0 (bplus (buminus a) a) (bzero n) (buminus-is-correct n a)
buminus-is-correct .(suc n) (b1 {n} a) = f-equal b0 (bplus (bsuc (invert a)) a) (bzero n) (buminus-is-correct n a)

-- Now let's define a function for extracting LSB
lsb : {n : Nat} -> Binnum n -> Binnum n
lsb eod = eod
lsb (b0  a) = b0 (lsb a)
lsb .{suc n} (b1 {n} a) = b1 (bzero n)

-- And now let's put all pieces together
main-theorem : (n : Nat) -> (a : Binnum n) -> (band a (buminus a)) &#8801; (lsb a)
main-theorem .0 eod = refl
main-theorem .(suc n) (b0 {n} a) = f-equal b0 (band a (bsuc (invert a))) (lsb a) (main-theorem n a)
main-theorem .(suc n) (b1 {n} a) = f-equal b1 (band a (invert a)) (bzero n) (band-invert n a)



Кратко оно строится следующим образом: вначале определяем бинарные N-битные числа, затем определяем бинарное И, унарный минус, операцию по изъятию LSB (которая оставляет только младший установленный бит), после этого в main-theorem и доказываем что x & -x = LSB(x).

Суть доказательства в индукции по битам.
Для 0-битного числа доказательство тривиально,
далее рассматриваются 2 ситуации в зависимости от значения следующего бита и используем определения унарного минуса и and.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38631232
Strangecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strangecat
Код: sql
1.
2.
3.
4.
Nat = &#8469;  -- это юникодовый знак натуральных чисел 

test_suc0 : (bsuc b0x0) &#8801; (b0x1) -- 8801 это эквивалентность  (как равно=, но с тремя чертами)
test_suc0 = refl
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38632697
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strangecat, спасибо.
К сожалению мои знания об этом языке ограничиваются очень немногим. Потому я не смогу качественно изучить ваш код. А не могли бы вы сами показать ваши рассуждения методом математической индукции. Пока не представляю как это будет выглядеть (сам метод понятен, как его грамотно приложить сюда не до конца понятно)
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38632708
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSА не могли бы вы сами показать ваши рассуждения методом математической индукции.

В смысле доказать это "на бумаге".

Ваша фраза

Strangecat
Для 0-битного числа доказательство тривиально,
далее рассматриваются 2 ситуации в зависимости от значения следующего бита и используем определения унарного минуса и and.

0-битное число ?

Для меня метод матиндукции это
1. Стартовая позиция, для неё утверждение истинно
2. Делаем предположение что для i это истина, и исходя из этого предположения доказываем для i+1
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38632799
Strangecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Может по числам тоже можно.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38632909
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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).
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38632930
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, доказательство проще сразу провести для дополнительного кода.
Но если это кажется сложным или неочевидным, то годится то, что я привел выше.
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38633063
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
угу, если принять что
-n = not (n-1) = not (n) +1

все это учат в самом начале
интересно, а есть другие способы представления отрицательных чисел ... ?
...
Рейтинг: 0 / 0
Доказательство формулы x&(-x)=x^p
    #38633112
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)угу, если принять что
-n = not (n-1) = not (n) +1

все это учат в самом начале
интересно, а есть другие способы представления отрицательных чисел ... ?

А зачем другие представления, если приведены самые простые (в частности not(n)+1 - самое простое представление).
другие можно придумать.. вот только зачем (двумя действиями как тут ограничиться не получится)
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Доказательство формулы x&(-x)=x^p
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]