2016-09-14 40 views
9

Znałem słynne pytanie o implementacji mnożenia za pomocą dodawania lub potęgowania za pomocą mnożenia, za pomocą algorytmów pętli lub przesuwania bitów i dodawania przesuniętych kombinacji bitowych grup.Implementacja dodatku za pomocą mnożenia

Teraz zastanawiałam się, czy jest jakiś sposób, aby wdrożyć dodatek przy użyciu operacji tylko wyższy poziom, takich jak mnożenie konkretnie, czy potęgowania, logarytm itd (bez odejmowania)

można to osiągnąć z niektórych algorytm łączący te operacje (i ewentualnie operatory bitowe jako asystenci) lub dodatek jest podstawową operacją, która służy jako aksjomat, więc nie można jej odtworzyć na inne sposoby, z wyjątkiem jej definicji?

Dzięki.

+8

To jest pytanie matematyczne i nie jest związane z programowaniem. – nwellnhof

+0

przeczytać o produkcie Cauchy, może dostaniesz podpowiedzi – Monah

+0

Nie jestem matematykiem, ale nie jestem tego świadomy. – duffymo

Odpowiedz

7

Tak oczywiście:

a + b = ln(exp(a) * exp(b))

Edit: Podnoszenie oczy nad praktyczność powyżej do bardziej spekulatywny, powiedziałbym, że należy się spodziewać, aby móc wykonywać operacje niższego rzędu przez wyższe . Tak długo, jak operacja na wyższym poziomie jest budowana przez operacje niższego poziomu, powinny one być w stanie wykonać przynajmniej to, co ich kamienie budowlane mogą. Jednak prawdopodobnie nie w prosty i bezpośredni sposób, patrz komentarz poniżej. Człowiek może ci powiedzieć, że 1 + 1 = 2, ale o wiele taniej i bezpieczniej byłoby poprosić o komputer lub jeszcze prostsze urządzenie.

+4

Należy zwrócić uwagę na ryzyko przepełnienia i niedokładnych wyników, jeśli są stosowane w rzeczywistych systemach. – Leon

+0

Co zrobić, jeśli chcemy korzystać z operacji, które faktycznie można wdrożyć, czy nadal można to zrobić? – harold

+1

Cóż, ln() i exp() są oczywiście implementalbe tak jak ln (exp (a) * exp (b)), ale jeśli masz na myśli "Wdrażalny bez użycia dodatku", to w zasadzie mówimy o wykonywaniu dodatku bez wykonywania dodanie. To powinno być naprawdę trudne. –

2

Cóż, jeśli chcesz być pedantyczny, dwie liczby w reprezentacji binarnej można dodać za pomocą tylko operatorów bitowych LUB, XOR i AND, bez ścisłego "dodawania" czegokolwiek. Dla suma a + b = c bit n-ta może być obliczona w następujący sposób:

C n = a n XOR b n XOR przeprowadzić
przenoszenia = (a n I b n) OR ((a n XOR b n) i nosić)

I zalecana C w tym celu unikaj używania n ++ podczas iteracji po bitach i wrzucaj kilka multiplikacji na dobrą miarę:

int add(int a, int b) { 
    int c = 0; 
    char carry = 0; 
    for (int mask = 1; mask; mask *= 2) { 
     char an = a & mask ? 1 : 0; 
     char bn = b & mask ? 1 : 0; 
     c |= (an^bn^carry) * mask; 
     carry = an & bn | (an^bn) & carry; 
    } 
    return c; 
} 
+1

To nie jest wystarczająco pedantyczne. Zdefiniuj "ścisłe dodawanie". (O ile mogę powiedzieć, co można opisać z operacji bitowych faktycznie bardziej przypomina to, co rzeczywiście ma komputer kiedy trafiliśmy '+'). –

+0

To jedna uparta interpretacja 'Korzystanie Multiplication'/** ** Tylko _higher operacje poziomu, takie jak mnożenie, lub [transcendentale]. – greybeard

+1

@greybeard wziąłem słowa "jakiś algorytm łączenia tych operacji (i ewentualnie operatory bitowe)" dosłownie :-) – m69