Информация об изменениях

Сообщение 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):
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-лем):
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));
}