Portál AbcLinuxu, 8. listopadu 2025 00:07
miller_rabin. Môj odhad je, že
k = v_bignum_bit_msb(nmo);vráti záporné číslo a potom sa to v nasledujúcom fore cyklí. Navrhujem podávať na každý riadok printf a potom sa uvidí.
.
v_randgen.c ve funkci VRandGen * v_randgen_new(void). Měl by se tam otevřít /dev/urandom, ale nic to nedělá. Když dám za gen->fd = open(SOURCE, O_RDONLY); nějaký printf, tak ho to ani nevypíše ale až po delší době to přeskočí do fce v_randgen_get() v témže souboru.
VRandGen * v_randgen_new(void) otevře deskriptor na /dev/urandom a ten vrátí – to ještě funguje tak jak má.
Pak v souboru v_bignum.c funkce void v_bignum_set_random(VBigDig *x, VRandGen *gen) zavolá fci void v_randgen_get(VRandGen *gen, void *bytes, size_t num) z v_randgen.c.
Tahle funkce vezme deskriptor na /dev/urandom a ten se pokusí přečíst. Pomocí ukazatale by se měly přečtená data vrátit volané funkci. A tady je průser: /dev/urandom se začne číst, ale už neskončí.
void v_prime_set_random(VBigDig *x)
{
int bits = v_bignum_bit_size(x);
VRandGen *gen;
gen = v_randgen_new();
do
{
/* Create candidate, making sure it's both odd and non-zero. */
v_bignum_set_random(x, gen);
/* Set topmost two bits, makes sure products are big. */
v_bignum_bit_set(x, bits - 1);
v_bignum_bit_set(x, bits - 2);
/* Set lowermost bit, makes sure it is odd (better prime candidate that way). */
v_bignum_bit_set(x, 0);
} while(!v_prime_test(x, gen));
/* printf("Prime found after %d iterations: ", count);
v_bignum_print_hex_lf(x);
*/
v_randgen_destroy(gen);
}
. Ještě vymyslet jak získat obsah gen, ale to asi nebude třeba, podle zběžného kouknutí na kód to vypadá, že ukládá jenom deskriptor na /dev/urandom.
dd if=/dev/urandom of=../verse-tests/rand count=1000 bs=32. Potom som prepísal 64. riadok v_randgen.c na #define SOURCE "rand". Touto úpravou mi začal program po každom spustení generovať tú istú sekvenciu čísel, takže sa dá pekne porovnať dobrý a zlý výstup.
Dobrý program označil 0xC4FD1FB7720D4DF2C15DBD9A0FF4C9454399401720757DAB7DDBD68F909D3BC1 ako prvočíslo.
Zlý si myslí, že 0xC4FD1FB7720D4DF2C15DBD9A0FF4C9454399401720757DAB7DDBD68F909D3BC1 nie je prvočíslo a pokračuje drzo ďalej.
v_bignum_set_string_hex(), popř. pomocí v_bignum_set_string() x nastavil na nějaké zaručené prvočíslo (některá jsou v v_prime_set_table(), ale zkoušel jsem i jiná).
v_bignum_reduce(d, n, mu); pri druhom prechode for cyklom vracia nesprávny výsledok.
v_bignum_bit_shift_right() volanej z v_bignum_reduce()
v_bignum_bit_shift_right() ale v_bignum_mul(), nejak som to splietol
v_bignum_square_half(d);
Prvá kompilácia:
./a.out > out1
Druhá kompilácia:
./a.out > out2
diff -u out1 out2 > priloha.diff
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.