eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingCo robi permuted congruential generator XSL-RR-RR? Próbuję zrozumieć scheamt działania.Re: Co robi permuted congruential generator XSL-RR-RR? Próbuję zrozumieć scheamt działania.
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.n
    et!aioe.org!nyPK7k8oeDafdNpooDsxZQ.user.gioia.aioe.org.POSTED!not-for-mail
    From: Mateusz Viste <m...@x...invalid>
    Newsgroups: pl.comp.programming
    Subject: Re: Co robi permuted congruential generator XSL-RR-RR? Próbuję zrozumieć
    scheamt działania.
    Date: Sat, 2 Jan 2021 17:15:07 +0100
    Organization: . . .
    Lines: 86
    Message-ID: <20210102171507.40aeb31a@mateusz>
    References: <2...@g...com>
    <20210102144507.535f1472@mateusz>
    <0...@g...com>
    <f...@g...com>
    <20210102154922.59e6c404@mateusz>
    <4...@g...com>
    NNTP-Posting-Host: nyPK7k8oeDafdNpooDsxZQ.user.gioia.aioe.org
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: quoted-printable
    X-Complaints-To: a...@a...org
    X-Notice: Filtered by postfilter v. 0.9.2
    X-Newsreader: Claws Mail 3.17.8 (GTK+ 2.24.32; x86_64-suse-linux-gnu)
    Xref: news-archive.icm.edu.pl pl.comp.programming:215267
    [ ukryj nagłówki ]

    2021-01-02 o 07:25 -0800, o...@g...com napisał:
    > Może napiszę jak ja to rozumiem na chłopski rozum.
    >
    > 1. count = (int)(x >> 122)
    >
    > Weź jakąś 128-bitową liczbę startową X i zrób right shift o 122
    > miejsca. 6 najbardziej znaczących bitów trafia w miejsce najmniej
    > znaczących i wychodzi nam jakaś mała 6-bitowa liczba.

    Zgadza się. I tutaj, zakładając, że count zostało wcześniej zdefiniowane
    jako int, kompilator może się poskarżyć "uważaj, bo próbujesz przypisać
    zmienną 128-bitową (x) do zmiennej o mniejszej szerokości (count)".
    Dlatego programista wykonuje cast wyniku do (int), aby powiedzieć
    kompilatorowi "spokojnie, wiem co robię, to naprawdę ma być int".

    > Swoją drogą dlaczego autor wymyślił tego shifta akurat o 122 bity
    > (być może z jakichś powodów daje najlepsze wyniki)?

    To już należałoby jego zapytać. Ew. poczytać publikacje dot. tego
    algorytmu.

    > 2. low64 = rotr64((uint64_t)(x ^ (x >> 64)), count)
    >
    > Oblicz pierwszą połówkę jako low64. Najpierw policz X XOR X >> 64.
    > Wychodzi mi tu 128-bitowa liczba, ale rozumiem, że uint64_t zawęża ją
    > tylko do 64 najmniej znaczących bitów?

    Tak. 64 najbardziej znaczące bity zostają usunięte, za sprawą castu
    (castingu? nie mam pewności jak to się mówi po polskiemu) do uint64_t.

    > Teraz liczymy na niej rotr64 z przesunięciem o count.

    Warto tu zaznaczyć, że rotr64 to nie C. Po nazwie mogę tylko
    przypuszczać, co robi, ale dla pełnej jasności należałoby doczytać
    dokumentację danej implementacji.

    > 3. high64 = rotr((uint64_t)(x >> 64), low64 & 63)
    >
    > Tu liczymy wyższą połówkę. Tutaj otrzymujemy 64-bitową liczbę poprzez
    > X >> 64 i robimy na niej rotr. Nadal nie rozumiem dlaczego nie możemy
    > tu zrobić i zapisać również rotr64?

    Też nie wiem. Tym bardziej, że autor wyszczególnił cast do uint64_t, a
    prototyp rotr() który podaje mi google wskazuje że rotr() oczekuje
    inta. Nie mam pewności, co autor miał na myśli, ale wygląda mi to na
    pomyłkę.

    > >> Gdyby X było powiedzmy liczbą 84 bitową, to
    > >> 64 zrobi z niej liczbę 20-bitową. Czyli wtedy nie możemy zrobić
    > >> rotr64 (bo nie mamy 64 bitów)? A właściwie możemy, ale otrzymamy
    > >> inny wynik, niż rotr na liczbie 20-bitowej. Jedynie takie widzę tu
    > >> uzasadnienie.

    Na platformie, na której sizeof(int) == 8, wynik będzie identyczny w
    obu przypadkach.

    > 4. return (uint128_t)high64 << 64 | low64
    >
    > Tutaj rozumiem, że robimy shift na high64 i doklejamy do tego low64?
    > low64 to będą bity najmniej znaczące.

    Tak. A cast do uint128_t jest tutaj konieczny, bo bez niego high64
    by się po prostu wyzerował (wyshiftował).

    Mateusz

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: