Wykluczanie ze zbioru wielokrotności liczb pierwszych

Problemy matematyczne "ubrane" w życiowe problemy.
ksetlak
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 23 sty 2024, o 17:00
Płeć: Mężczyzna
wiek: 40
Podziękował: 1 raz

Wykluczanie ze zbioru wielokrotności liczb pierwszych

Post autor: ksetlak »

Mam zbiór liczb naturalnych od \(\displaystyle{ 1}\) do \(\displaystyle{ 105}\) zwany zbiorem \(\displaystyle{ A}\), którego zakres został utworzony w ten sposób: \(\displaystyle{ 105=3\cdot 5\cdot 7}\). W jaki sposób znaleźć liczby, które nie są wielokrotnościami liczb pierwszych \(\displaystyle{ 3, 5}\) i \(\displaystyle{ 7}\)? Chodzi mi o algorytm, który wykona jak najmniej kroków i o ewentualny matematyczny zapis takiego algorytmu.

Klasyczne podejście w programowaniu wygląda tak:
Można wziąć po kolei każdą liczbę ze zbioru \(\displaystyle{ A}\) i sprawdzić, czy jest podzielna przez \(\displaystyle{ 3}\).
Jeśli nie jest, to zapisać ją w zbiorze \(\displaystyle{ B}\).
Następnie wziąć liczby ze zbioru \(\displaystyle{ B}\) i sprawdzić, czy są podzielne przez \(\displaystyle{ 5}\).
Jeśli dana liczba nie jest, zapisać ją w zbiorze \(\displaystyle{ C}\).
Następnie sprawdzić liczby w zbiorze \(\displaystyle{ C}\), czy są podzielne przez \(\displaystyle{ 7}\).
Jeśli nie, zapisać je w zbiorze \(\displaystyle{ D}\). Koniec.

Ale jak to zoptymalizować?

Możliwe, że można wykorzystać "symetrię" i zrobić zbiór \(\displaystyle{ A'}\) zawierający jedynie \(\displaystyle{ 52}\) elementy (na grafice jest "symetria" wokół niebieskiej linii). Następnie obliczyć odpowiednio zbiory \(\displaystyle{ B', C'}\) i \(\displaystyle{ D'. }\)
Potem zrobić "lustrzane odbicie" zbioru \(\displaystyle{ D'.}\)
Zbiór \(\displaystyle{ D'}\) oraz ten "lustrzany" są prawidłowym wynikiem.

Jeśli ktoś może podpowiedzieć lepszy sposób, będę wdzięczny :)

A jeśli ten sposób jest optymalny, to może da się go rozwinąć? Tych "symetrii" jest w większych zbiorach więcej, ale są tam pewne komplikacje.

Mnie interesują zbiory utworzone przez mnożenie kolejnych liczb pierwszych, czyli np. \(\displaystyle{ 3\cdot 5\cdot 7\cdot 11, 3\cdot 5\cdot 7\cdot 11\cdot 13, 3\cdot 5\cdot 7\cdot 11\cdot 13\cdot 17, 3\cdot 5\cdot 7\cdot 11\cdot 13\cdot 17\cdot 19}\) itd.

Może nie trzeba sprawdzać wszystkiego, tylko dzięki tej "symetrii", dzięki swoistym "fraktalom dzielników" da się sprawdzić małą część, a potem przez duplikowanie (z uwzględnieniem jakichś poprawek) uzyskać oczekiwany wynik?

Zadaję pytanie, ponieważ w modyfikacji algorytmu Fermata, o której pisałem w innym wątku, właśnie taki zbiór \(\displaystyle{ D, D''}\) itp. odgrywa zasadniczą rolę, a zakres zbioru jest ogromny (liczby stucyfrowe itd.).
Załączniki
ksetlak.jpg
ksetlak.jpg (53.43 KiB) Przejrzano 270 razy
Ostatnio zmieniony 28 sty 2024, o 15:31 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Brak LaTeXa - proszę zapoznać się z instrukcją: https://matematyka.pl/latex.htm.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10227
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

Re: Wykluczanie ze zbioru wielokrotności liczb pierwszych

Post autor: Dasio11 »

ksetlak pisze: 28 sty 2024, o 15:06W jaki sposób znaleźć liczby, które nie są wielokrotnościami liczb pierwszych \(\displaystyle{ 3, 5}\) i \(\displaystyle{ 7}\)?
Chodzi o liczby niepodzielne przez żadną z tych liczb, czyli o przekrój zbiorów \(\displaystyle{ B}\), \(\displaystyle{ C}\), \(\displaystyle{ D}\)? W jakiej postaci chciałbyś otrzymać wynik?
ksetlak
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 23 sty 2024, o 17:00
Płeć: Mężczyzna
wiek: 40
Podziękował: 1 raz

Re: Wykluczanie ze zbioru wielokrotności liczb pierwszych

Post autor: ksetlak »

Czyli za pomocą zwyczajnego skryptu php liczę tak:
mam zbiór
\(\displaystyle{ \left\{ 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 \right\} }\).
Potem
\(\displaystyle{ \left\{ 1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 100, 101, 103, 104 \right\} }\) (105 operacji).
Potem
\(\displaystyle{ \left\{ 1, 2, 4, 7, 8, 11, 13, 14, 16, 17, 19, 22, 23, 26, 28, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46, 47, 49, 52, 53, 56, 58, 59, 61, 62, 64, 67, 68, 71, 73, 74, 76, 77, 79, 82, 83, 86, 88, 89, 91, 92, 94, 97, 98, 101, 103, 104 \right\} }\) (70 operacji).
Potem
\(\displaystyle{ \left\{ 1, 2, 4, 8, 11, 13, 16, 17, 19, 22, 23, 26, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46, 47, 52, 53, 58, 59, 61, 62, 64, 67, 68, 71, 73, 74, 76, 79, 82, 83, 86, 88, 89, 92, 94, 97, 101, 103, 104 \right\} }\) (56 operacji).

231 operacji.

A dzięki symetrii mogę zrobić tak:
mam zbiór
\(\displaystyle{ \left\{ 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 \right\} }\).
Biorę pół zbioru
\(\displaystyle{ \left\{ 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 \right\} }\).
Potem
\(\displaystyle{ \left\{ 1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52 \right\} }\) (52 operacje).
Potem
\(\displaystyle{ \left\{ 1, 2, 4, 7, 8, 11, 13, 14, 16, 17, 19, 22, 23, 26, 28, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46, 47, 49, 52 \right\} }\) (35 operacji).
Potem
\(\displaystyle{ \left\{ 1, 2, 4, 8, 11, 13, 16, 17, 19, 22, 23, 26, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46, 47, 52 \right\} }\) (28 operacji).
Potem
\(\displaystyle{ \left\{ 1, 2, 4, 8, 11, 13, 16, 17, 19, 22, 23, 26, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46, 47, 52, 105-1, 105-2, 105-4, 105-8, 105-11, 105-13, 105-16, 105-17, 105-19, 105-22, 105-23, 105-26, 105-29, 105-31, 105-32, 105-34, 105-37, 105-38, 105-41, 105-43, 105-44, 105-46, 105-47, 105-52 \right\} }\) (52 operacje).

167 operacji.

Nawet gdybym musiał zrobić dodatkowo 54 operacje, żeby wydzielić 52 elementy ze zbioru 105-elementowego, czyli łącznie 220 operacji, to korzystając z symetrii i tak zyskuję na czasie.
Ukryta treść:    
Dodano po 1 godzinie 1 minucie 51 sekundach:
Ukryta treść:    
ODPOWIEDZ