Natychmiastowe generowanie sekwencji Mosera-de Bruijna. Obliczanie sum różnych potęg 4 z reprezentacjami w systemie czwórkowym używającymi tylko 0 i 1. Darmowe narzędzie online do edukacji matematycznej i badań.
Sekwencje Mosera-de Bruijna zawierają liczby, które można zapisać jako sumy różnych potęg liczby 4
Sekwencja Mosera-de Bruijna składa się z liczb, które można wyrazić jako sumy różnych potęg liczby 4. Nazwana na cześć matematyków Leo Mosera i Nicolaasa Goverta de Bruijna, sekwencja zaczyna się: 0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85...
Co czyni tę sekwencję interesującą? Gdy zapiszesz dowolny jej element w systemie czwórkowym, zobaczysz tylko cyfry 0 i 1 — nigdy 2 lub 3. Oznacza to, że każda liczba jest zbudowana przez dodanie potęg liczby 4 (takich jak 4⁰, 4¹, 4², 4³), gdzie każda potęga pojawia się jeden raz lub wcale.
Oto praktyczny przykład: Liczba 21 pojawia się w sekwencji, ponieważ równa się 16 + 4 + 1, co jest 4² + 4¹ + 4⁰. W systemie czwórkowym zapisuje się to jako „111" — tylko 0 i 1. Porównaj to z liczbą 22, która wymagałaby „2" w jej reprezentacji czwórkowej (122), więc nie kwalifikuje się do sekwencji.
Sekwencja pojawia się w addytywnej teorii liczb, kombinatoryce i badaniach nad zbiorami wolnymi od sum. Można ją traktować jako czwórkowego kuzyna systemu binarnego — zamiast potęg liczby 2, pracujesz z potęgami liczby 4. Tworzy to znacznie rzadszą sekwencję, ponieważ większość liczb całkowitych zostaje pominięta.
Korzystanie z tego generatora jest proste:
Obliczenia są wykonywane całkowicie w przeglądarce przy użyciu JavaScript, więc nie ma opóźnień serwera ani zależności od internetu — jest szybko i działa offline po załadowaniu strony.
Generator sprawdza poprawność wprowadzonych danych, aby zapobiec błędom:
Dlaczego limit 1000 terminów? Chociaż algorytm jest wydajny, generowanie tysięcy terminów może obciążyć pamięć przeglądarki, szczególnie na urządzeniach mobilnych. W praktyce rzadko potrzebujesz więcej niż 100-200 terminów do większości analiz matematycznych lub celów edukacyjnych.
Sekwencję Mosera-de Bruijna można zdefiniować na trzy równoważne sposoby, z których każdy oferuje różne spostrzeżenia:
Forma addytywna (potęgi 4): Liczba n należy do sekwencji, gdy można ją zapisać jako: gdzie S jest dowolnym zbiorem nieujemnych liczb całkowitych. Każda potęga 4 może wystąpić raz lub wcale — powtórzenia są niedozwolone.
Reprezentacja w systemie czwórkowym (najprostszy test): Przekształć liczbę do systemu czwórkowego. Jeśli widzisz tylko 0 i 1 (bez 2 i 3), jest ona w sekwencji. Jest to najszybszy sposób sprawdzenia przynależności ręcznie.
Korespondencja binarna (najbardziej przydatna do obliczeń): Aby znaleźć n-ty element (zaczynając od n=0): gdzie są cyframi binarnymi n. Tłumaczenie: Weź binarną reprezentację swojego indeksu, a następnie zamień każdy bit "1" na odpowiadającą mu potęgę 4.
Zobaczmy, jak te definicje działają w praktyce:
Metoda korespondencji binarnej jest tym, co ten generator wykorzystuje pod spodem — jest obliczeniowo wydajna, ponieważ operacje bitowe są szybkie.
Generator używa korespondencji binarnej, ponieważ jest szybki i prosty:
Proces krok po kroku:
Przykład rozwiązania: Znajdowanie 6. termu (indeks 5)
Obliczmy M(5) krok po kroku:
Ta metoda dobrze się skaluje. Dla dużych indeksów zasadniczo wykonujesz przesunięcia bitowe i dodawanie — operacje, które współczesne procesory wykonują niezwykle szybko.
Chcesz sprawdzić, czy konkretna liczba jest w sekwencji Mosera-de Bruijna? Użyj testu w systemie czwórkowym:
Przykład: Czy 85 jest w sekwencji?
Przykład przeciwny: Czy 90 jest w sekwencji?
Generator implementuje to za pomocą operatorów bitowych JavaScript, które są natywne dla języka i wysoce zoptymalizowane w nowoczesnych przeglądarkach.
Sekwencja Mosera-de Bruijna zajmuje się czystymi liczbami całkowitymi:
Ten wykładniczy wzrost oznacza, że sekwencja szybko się powiększa. 20. termin to już 340, a przy 100. terminie masz do czynienia z liczbami w milionach.
Nauczanie Systemów Liczbowych: Kiedy używałem tego w salach lekcyjnych, uczniowie znacznie szybciej rozumieją konwersje między systemami liczbowymi, gdy mogą eksperymentować z sekwencją Mosera-de Bruijna. Pomaga ona przerzucić most między systemem binarnym (base 2) a bardziej złożonymi systemami liczbowymi. Uczniowie od razu widzą, jak zmiana podstawy wpływa na gęstość sekwencji.
Rozumienie Operacji Bitowych: Studenci informatyki korzystają z możliwości zobaczenia bezpośredniego połączenia między reprezentacją binarną a sekwencjami matematycznymi. Algorytm pokazuje, jak manipulacja bitami przekłada się na rzeczywiste obiekty matematyczne — nie tylko abstrakcyjne operacje.
Kombinatoryka i Zbiory Wolne od Sum: Badacze studiujący bazy addytywne używają takich sekwencji do eksploracji zbiorów pozwalających na unikalne reprezentacje. Sekwencja Mosera-de Bruijna jest modelowym przykładem zbioru, gdzie każda reprezentowalna liczba ma dokładnie jedną reprezentację.
Addytywna Teoria Liczb: Sekwencja pomaga badać pytania dotyczące rozkładu liczb całkowitych na sumy. Jest związana z problemami w Internetowej Encyklopedii Sekwencji Liczb Całkowitych (OEIS), gdzie jest skatalogowana jako A000695.
Projektowanie Algorytmów: Algorytm generowania prezentuje wydajną konstrukcję sekwencji. Można wygenerować tysiące elementów przy minimalnym nakładzie obliczeniowym, co czyni go użytecznym do testowania algorytmów lub nauczania efektywnych wzorców kodowania.
Zadania Rozpoznawania Wzorców: Podczas pracy z rzadkimi zbiorami liczb całkowitych lub schematami kompresji danych, zrozumienie zachowania sekwencji takich jak Moser-de Bruijna pomaga podejmować decyzje projektowe dotyczące strategii kodowania.
Jeśli sekwencja Mosera-de Bruijna cię interesuje, te powiązane sekwencje oferują podobne wzorce z różnymi podstawami lub ograniczeniami:
Potęgi 2 (OEIS A000079): 1, 2, 4, 8, 16, 32... Najprostsza addytywna podstawa. Każda potęga 2 pojawia się dokładnie raz, tworząc bloki budujące liczb binarnych.
Wszystkie Nieujemne Liczby Całkowite (Sumy Binarne): 0, 1, 2, 3, 4, 5, 6, 7... Gdy pozwolisz na dowolną sumę różnych potęg 2, otrzymujesz każdą możliwą liczbę całkowitą — to jest reprezentacja binarna.
Sumy Różnych Potęg 3 (OEIS A005836): 0, 1, 3, 4, 9, 10, 12, 13... Ta sama koncepcja co Moser-de Bruijn, ale używająca potęg 3 zamiast 4. Są to liczby, których reprezentacja w systemie trójkowym zawiera tylko 0 i 1.
Liczby Fibbinarne (OEIS A003714): 0, 1, 2, 4, 5, 8, 9, 10... Liczby, których forma binarna nie ma kolejnych 1. Powiązane z systemami liczb Fibonacciego i twierdzeniem Zeckendorfa.
Sekwencja Stanleya: Odpowiednik Mosera-de Bruijna w systemie trójkowym — liczby, które w reprezentacji trójkowej nie mają 1 (dozwolone są tylko 0 i 2).
Internetowa Encyklopedia Sekwencji Liczb Całkowitych (OEIS) kataloguje setki tysięcy sekwencji. Szukaj terminów takich jak „addytywna podstawa", „zbiór sum-wolny" lub „różne potęgi", aby znaleźć powiązane sekwencje. Sama sekwencja Mosera-de Bruijna jest A000695 w bazie danych OEIS.
Leo Moser (1921-1970) i Nicolaas Govert de Bruijn (1918-2012) obaj wnieśli trwały wkład w matematykę, mimo że wywodzili się z różnych środowisk. Moser, austriacko-kanadyjski matematyk, pracował obszernie w teorii liczb, kombinatoryce i geometrii — możesz kojarzyć jego nazwisko z równaniem Erdősa-Mosera. De Bruijn, holenderski matematyk, pozostawił swój ślad w kombinatoryce, teorii grafów i informatyce. Jego sekwencje de Bruijna (różne od tej) są fundamentalne w teorii kodowania i są nadal szeroko stosowane.
Ich wspólna sekwencja pojawiła się w latach 60. podczas badań nad addytywną teorią liczb. Matematycy zastanawiali się: które zbiory liczb całkowitych pozwalają na jednoznaczne reprezentowanie innych liczb jako sum? Potęgi liczby 4 okazały się jednym takim zbiorem, a sekwencja Mosera-de Bruijna uchwytuje wszystkie możliwe sumy, które można utworzyć.
Sekwencja mieści się w szerszym badaniu baz addytywnych — zbiorów liczb całkowitych, które można budować poprzez dodawanie. Niektóre bazy pozwalają na unikalne reprezentacje (jak potęgi 4), podczas gdy inne nie. Zrozumienie, które bazy mają jakie własności, pozostaje aktywnym obszarem badań w addytywnej teorii liczb.
Znajdziesz tę sekwencję jako A000695 w OEIS, gdzie matematycy udokumentowali jej powiązania z reprezentacją binarną, systemami kwaternalnymi (o podstawie 4) i właściwościami kombinatorycznymi. Współczesna informatyka znalazła dla niej nowe zastosowania, szczególnie w algorytmach obejmujących manipulację bitami i wydajne kodowanie rozrzedzonych struktur danych.
Chcesz samodzielnie zaimplementować generator sekwencji Mosera-de Bruijna? Oto wydajne implementacje w popularnych językach programowania. Każdy przykład zawiera generator sekwencji oraz funkcję sprawdzania przynależności.
1def moser_de_bruijn(n):
2 """Generuj pierwsze n elementów sekwencji Mosera-de Bruijna."""
3 sequence = []
4 for i in range(n):
5 term = 0
6 power = 1
7 temp = i
8 while temp > 0:
9 if temp & 1: # Sprawdź, czy najmniej znaczący bit to 1
10 term += power
11 power *= 4
12 temp >>= 1 # Przesuń w prawo, aby sprawdzić następny bit
13 sequence.append(term)
14 return sequence
15
16# Przykład użycia:
17terms = moser_de_bruijn(20)
18print("Pierwsze 20 elementów sekwencji Mosera-de Bruijna:")
19print(terms)
20# Wynik: [0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85, 256, 257, 260, 261]
21
22def is_moser_de_bruijn(num):
23 """Sprawdź, czy liczba należy do sekwencji Mosera-de Bruijna."""
24 while num > 0:
25 digit = num % 4
26 if digit > 1:
27 return False
28 num //= 4
29 return True
30
31# Sprawdź, czy 21 jest w sekwencji
32print(f"Czy 21 jest w sekwencji? {is_moser_de_bruijn(21)}") # Prawda
33print(f"Czy 22 jest w sekwencji? {is_moser_de_bruijn(22)}") # Fałsz
341function moserDeBruijn(n) {
2 const sequence = [];
3 for (let i = 0; i < n; i++) {
4 let term = 0;
5 let power = 1;
6 let temp = i;
7 while (temp > 0) {
8 if (temp & 1) { // Sprawdź, czy najmniej znaczący bit to 1
9 term += power;
10 }
11 power *= 4;
12 temp >>= 1; // Przesuń w prawo, aby sprawdzić następny bit
13 }
14 sequence.push(term);
15 }
16 return sequence;
17}
18
19// Przykład użycia:
20const terms = moserDeBruijn(20);
21console.log("Pierwsze 20 elementów sekwencji Mosera-de Bruijna:");
22console.log(terms);
23// Wynik: [0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85, 256, 257, 260, 261]
24
25function isMoserDeBruijn(num) {
26 while (num > 0) {
27 const digit = num % 4;
28 if (digit > 1) {
29 return false;
30 }
31 num = Math.floor(num / 4);
32 }
33 return true;
34}
35
36// Sprawdź konkretne liczby
37console.log(`Czy 21 jest w sekwencji? ${isMoserDeBruijn(21)}`); // prawda
38console.log(`Czy 22 jest w sekwencji? ${isMoserDeBruijn(22)}`); // fałsz
391import java.util.ArrayList;
2import java.util.List;
3
4public class MoserDeBruijnGenerator {
5
6 public static List<Integer> generateSequence(int n) {
7 List<Integer> sequence = new ArrayList<>();
8 for (int i = 0; i < n; i++) {
9 int term = 0;
10 int power = 1;
11 int temp = i;
12 while (temp > 0) {
13 if ((temp & 1) == 1) { // Sprawdź, czy najmniej znaczący bit to 1
14 term += power;
15 }
16 power *= 4;
17 temp >>= 1; // Przesuń w prawo, aby sprawdzić następny bit
18 }
19 sequence.add(term);
20 }
21 return sequence;
22 }
23
24 public static boolean isMoserDeBruijn(int num) {
25 while (num > 0) {
26 int digit = num % 4;
27 if (digit > 1) {
28 return false;
29 }
30 num /= 4;
31 }
32 return true;
33 }
34
35 public static void main(String[] args) {
36 List<Integer> terms = generateSequence(20);
37 System.out.println("Pierwsze 20 elementów sekwencji Mosera-de Bruijna:");
38 System.out.println(terms);
39
40 System.out.println("Czy 21 jest w sekwencji? " + isMoserDeBruijn(21)); // prawda
41 System.out.println("Czy 22 jest w sekwencji? " + isMoserDeBruijn(22)); // fałsz
42 }
43}
441#include <iostream>
2#include <vector>
3
4std::vector<int> moserDeBruijn(int n) {
5 std::vector<int> sequence;
6 for (int i = 0; i < n; i++) {
7 int term = 0;
8 int power = 1;
9 int temp = i;
10 while (temp > 0) {
11 if (temp & 1) { // Sprawdź, czy najmniej znaczący bit to 1
12 term += power;
13 }
14 power *= 4;
15 temp >>= 1; // Przesuń w prawo, aby sprawdzić następny bit
16 }
17 sequence.push_back(term);
18 }
19 return sequence;
20}
21
22bool isMoserDeBruijn(int num) {
23 while (num > 0) {
24 int digit = num % 4;
25 if (digit > 1) {
26 return false;
27 }
28 num /= 4;
29 }
30 return true;
31}
32
33int main() {
34 std::vector<int> terms = moserDeBruijn(20);
35 std::cout << "Pierwsze 20 elementów sekwencji Mosera-de Bruijna:" << std::endl;
36 for (int term : terms) {
37 std::cout << term << " ";
38 }
39 std::cout << std::endl;
40
41 std::cout << "Czy 21 jest w sekwencji? " << (isMoserDeBruijn(21) ? "prawda" : "fałsz") << std::endl;
42 std::cout << "Czy 22 jest w sekwencji? " << (isMoserDeBruijn(22) ? "prawda" : "fałsz") << std::endl;
43
44 return 0;
45}
46Wszystkie te implementacje stosują ten sam schemat: używają operacji bitowych do odczytu binarnej reprezentacji indeksu, a następnie konstruują odpowiednią sumę potęg 4. Funkcje sprawdzania przynależności używają podejścia bazowego na liczbach 4 — sprawdzając, czy cyfry są ograniczone do 0 i 1.
Pod względem wydajności, te implementacje są bardzo efektywne. Złożoność czasowa wynosi O(n × log n) dla generowania n elementów, ponieważ każdy element wymaga sprawdzenia O(log i) bitów. Sprawdzenie przynależności dla pojedynczej liczby ma złożoność O(log N), gdzie N to testowana liczba.
Poniższa tabela przedstawia pierwsze 32 terminy z pełnymi rozbiciami. Zauważ, jak reprezentacja w systemie czwórkowym zawiera tylko 0 i 1 oraz jak dekompozycja mapuje się bezpośrednio na indeksy binarne:
| Indeks | Term | Dekompozycja | Baza-4 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 4⁰ | 1 |
| 2 | 4 | 4¹ | 10 |
| 3 | 5 | 4¹ + 4⁰ | 11 |
| 4 | 16 | 4² | 100 |
| 5 | 17 | 4² + 4⁰ | 101 |
| 6 | 20 | 4² + 4¹ | 110 |
| 7 | 21 | 4² + 4¹ + 4⁰ | 111 |
| 8 | 64 | 4³ | 1000 |
| 9 | 65 | 4³ + 4⁰ | 1001 |
| 10 | 68 | 4³ + 4¹ | 1010 |
| 11 | 69 | 4³ + 4¹ + 4⁰ | 1011 |
| 12 | 80 | 4³ + 4² | 1100 |
| 13 | 81 | 4³ + 4² + 4⁰ | 1101 |
| 14 | 84 | 4³ + 4² + 4¹ | 1110 |
| 15 | 85 | 4³ + 4² + 4¹ + 4⁰ | 1111 |
| 16 | 256 | 4⁴ | 10000 |
| 17 | 257 | 4⁴ + 4⁰ | 10001 |
| 18 | 260 | 4⁴ + 4¹ | 10010 |
| 19 | 261 | 4⁴ + 4¹ + 4⁰ | 10011 |
| 20 | 272 | 4⁴ + 4² | 10100 |
| 21 | 273 | 4⁴ + 4² + 4⁰ | 10101 |
| 22 | 276 | 4⁴ + 4² + 4¹ | 10110 |
| 23 | 277 | 4⁴ + 4² + 4¹ + 4⁰ | 10111 |
| 24 | 320 | 4⁴ + 4³ | 11000 |
| 25 | 321 | 4⁴ + 4³ + 4⁰ | 11001 |
| 26 | 324 | 4⁴ + 4³ + 4¹ | 11010 |
| 27 | 325 | 4⁴ + 4³ + 4¹ + 4⁰ | 11011 |
| 28 | 336 | 4⁴ + 4³ + 4² | 11100 |
| 29 | 337 | 4⁴ + 4³ + 4² + 4⁰ | 11101 |
| 30 | 340 | 4⁴ + 4³ + 4² + 4¹ | 11110 |
| 31 | 341 | 4⁴ + 4³ + 4² + 4¹ + 4⁰ | 11111 |
Rozpatrzmy dokładnie termin 21:
Widzisz wzór? Indeks binarny (111) mapuje się bezpośrednio na to, które potęgi 4 należy uwzględnić. Każdy bit "1" mówi, którą potęgę dołączyć.
Sekwencja rośnie wykładniczo — n-ty termin jest w przybliżeniu proporcjonalny do 4^(log₂(n)). Co to oznacza praktycznie?
Wraz ze wzrostem liczb, sekwencja staje się coraz bardziej rzadka. Pomijasz coraz więcej liczb całkowitych. Mimo tej rzadkości, sekwencja zawiera nieskończenie wiele terminów — nigdy nie przestaje rosnąć.
OEIS A000695 - Sekwencja Mosera-de Bruijna. Internetowa Encyklopedia Sekwencji Całkowitych. Kompleksowe dane i właściwości sekwencji.
De Bruijn, N. G. „O bazach dla zbioru liczb całkowitych." Publicationes Mathematicae Debrecen, tom 1, 1950, str. 232-242. Fundamentalna praca ustalająca kluczowe właściwości baz addytywnych.
Moser, Leo. „Zastosowanie szeregów generujących." Mathematics Magazine, tom 35, nr 1, 1962, str. 37-38. Wczesna praca badająca funkcje generujące sekwencji.
Stolarsky, Kenneth B. „Sumy potęgowe i wykładnicze sum cyfrowych związane z parzystością współczynników dwumianowych." SIAM Journal on Applied Mathematics, tom 32, nr 4, 1977, str. 717-730. Bada własności sum cyfrowych związanych z sekwencjami takimi jak Mosera-de Bruijna.
Allouche, Jean-Paul i Jeffrey Shallit. Sekwencje automatyczne: Teoria, Zastosowania, Uogólnienia. Cambridge University Press, 2003. Rozdział poświęcony sekwencjom automatycznym, w tym połączeniom z sekwencją Mosera-de Bruijna.
Zbiory Wolne od Sum - Wikipedia. Tło dotyczące szerszego kontekstu matematycznego teorii liczb addytywnych.
Bazy Addytywne - Wikipedia. Przegląd zbiorów, które mogą reprezentować liczby całkowite jako sumy.
Sekwencja ma kilka zastosowań: badania teorii liczb dotyczące baz addytywnych, prace kombinatoryczne nad zbiorami wolnymi od sum, edukację informatyczną (szczególnie w nauczaniu operacji bitowych i wydajnych algorytmów) oraz analizę wzorów matematycznych. Jest to również doskonałe narzędzie dydaktyczne do zrozumienia, jak różne systemy liczbowe są ze sobą powiązane.
Weź każdy indeks n począwszy od 0, przekształć go na system binarny, a następnie zamień każdy bit "1" na odpowiednią potęgę 4. Na przykład indeks 5 ma reprezentację binarną 101, więc obliczasz 4² + 4⁰ = 16 + 1 = 17. To jest 5. termin (licząc od indeksu 0).
Każda liczba w sekwencji ma charakterystyczną własność: jej reprezentacja w systemie czwórkowym zawiera tylko 0 i 1 - nigdy 2 lub 3. Oznacza to, że można zbudować każdy termin, dodając potęgi 4, gdzie każda potęga pojawia się co najwyżej raz. Jest to podobne do systemu binarnego, ale używającego potęg 4 zamiast potęg 2.
Przekształć swoją liczbę do systemu czwórkowego i sprawdź cyfry. Jeśli widzisz tylko 0 i 1, jest w sekwencji. Jeśli jakakolwiek cyfra to 2 lub 3, nie jest. Na przykład 21 w systemie czwórkowym to 111 (same 1 i 0), więc jest w sekwencji. Ale 22 w systemie czwórkowym to 112 (zawiera 2), więc nie jest.
N-ty termin M(n) następuje wg wzoru: M(n) = Σ(b_i × 4^i), gdzie b_i reprezentuje cyfry binarne n. Innymi słowy: napisz n w systemie binarnym, a następnie dla każdej pozycji z 1 dodaj odpowiednią potęgę 4.
Tak, ciągnie się w nieskończoność. Istnieje nieskończenie wiele terminów w sekwencji Mosera-de Bruijna. Jednak im wyżej się posuwasz, tym sekwencja staje się coraz rzadsza - pomijasz coraz więcej regularnych liczb całkowitych między członami sekwencji.
Sekwencje binarne (sumy potęg 2) mogą reprezentować każdą nieujemną liczbę całkowitą - to jest istota reprezentacji binarnej. Sekwencja Mosera-de Bruijna używa zamiast tego potęg 4, co tworzy znacznie rzadszy zbiór. Większość liczb całkowitych nie pojawia się w sekwencji Mosera-de Bruijna.
Leo Moser (1921-1970), austriacko-kanadyjski matematyk, oraz Nicolaas Govert de Bruijn (1918-2012), holenderski matematyk, badali tę sekwencję dogłębnie w latach 60. w ramach badań nad addytywną teorią liczb. Sekwencja nosi nazwiska obu naukowców.
Ten generator działa całkowicie w Twojej przeglądarce — bez instalacji, bez rejestracji, bez oczekiwania. Bez względu na to, czy jesteś studentem poznającym systemy liczbowe, badaczem eksplorującym bazy addytywne, czy po prostu matematycznie ciekawskim, możesz natychmiast generować terminy i samodzielnie obserwować wzorce. Spróbuj wygenerować różne ilości, aby zobaczyć, jak sekwencja się rozwija i które liczby całkowite zostają uwzględnione.
Odkryj więcej narzędzi, które mogą być przydatne dla Twojego przepływu pracy