Сообщение Re[9]: Рациональные числа от 04.04.2017 13:56
Изменено 04.04.2017 16:47 vdimas
Re[9]: Рациональные числа
Здравствуйте, kfmn, Вы писали:
V>>Иначе получалось противоречие сходу, т.к. 1/2 не является элементом мн-ва.
K>Откуда это?
Из условия. Иначе получается растущее вправо бесконечное мн-во, т.е. речи о его минимальности быть не может.
Т.е., мн-во fusible numbers бесконечно.
Тогда принадлежность к нему определяется элементарно (ответил сразу же):
Итого, решение:
UPD (сравнить с 0-лем и с нижней границей 1/2):
V>>Иначе получалось противоречие сходу, т.к. 1/2 не является элементом мн-ва.
K>Откуда это?
Из условия. Иначе получается растущее вправо бесконечное мн-во, т.е. речи о его минимальности быть не может.
Т.е., мн-во fusible numbers бесконечно.
Тогда принадлежность к нему определяется элементарно (ответил сразу же):
Если оно при этом рациональное, то знаменатель будет степенью двойки после сокращения дроби.
Итого, решение:
UPD (сравнить с 0-лем и с нижней границей 1/2):
bool isFusible(uint numerator, uint denominator) {
assert(denominator);
if(!numerator) return true;
if(numerator*2<denominator) return false;
uint a = numerator, b = denominator;
while(a!=b) if(a>b) a-=b; else b-=a;
denominator/=a;
return !(denominator&(denominator-1));
}
Re[9]: Рациональные числа
Здравствуйте, kfmn, Вы писали:
V>>Иначе получалось противоречие сходу, т.к. 1/2 не является элементом мн-ва.
K>Откуда это?
Из условия. Иначе получается растущее вправо бесконечное мн-во, т.е. речи о его минимальности быть не может.
Т.е., мн-во fusible numbers бесконечно.
Тогда принадлежность к нему определяется элементарно (ответил сразу же):
Итого, решение:
UPD (сравнить с 0-лем):
V>>Иначе получалось противоречие сходу, т.к. 1/2 не является элементом мн-ва.
K>Откуда это?
Из условия. Иначе получается растущее вправо бесконечное мн-во, т.е. речи о его минимальности быть не может.
Т.е., мн-во fusible numbers бесконечно.
Тогда принадлежность к нему определяется элементарно (ответил сразу же):
Если оно при этом рациональное, то знаменатель будет степенью двойки после сокращения дроби.
Итого, решение:
UPD (сравнить с 0-лем):
bool isFusible(uint numerator, uint denominator) {
assert(denominator);
if(!numerator) return true;
uint a = numerator, b = denominator;
while(a!=b) if(a>b) a-=b; else b-=a;
denominator/=a;
return !(denominator&(denominator-1));
}