Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <iostream>
- #include <stdint.h>
- #include <random>
- #include <cmath>
- using namespace std;
- class test
- {
- uint64_t N;
- uint64_t sN;
- uint64_t p1,p2,p3,ip;
- bool b;//czy jeszcze zostały nieodczytane liczby
- void generate_primes()
- {
- for (uint64_t i=3; i<=sN;i+=2) {
- //cout<<i<<endl;
- if (tab[(i-1)/2] ) {
- for (uint64_t j=(i-2)*i; j<N ; j+=i*2 )
- tab[(j-1)/2]=false;
- }
- }
- }
- uint64_t nextprime()
- {
- do {
- ip++;
- if (ip>=tab.size()) { //liczby sie skonczyuly
- ip=2; // mimo to dokończmy wypełnianie inta bitami z początku
- b=true;
- }
- }while( !tab[ip] );
- return 2*ip+1;
- }
- int next_bit()
- {
- do{
- p1=p2;
- p2=p3;
- p3=nextprime();
- }while ( p3+p1== 2*p2); // równoważne porównanium p2-p1 ? p3-p2
- //num_bits++;
- // if (p3+p1> 2*p2) num_set_bits++;
- return (p3+p1> 2*p2);
- }
- public:
- vector <bool> tab;
- uint64_t size() {return N;}
- bool isprime(uint64_t n)
- {
- if (n%2==0) return (2==n);
- else return tab[(n-1)/2];
- }
- test(uint64_t n): N(n), sN(sqrt(N)+330) , tab(n/2+1,true), ip(0),b(false)
- {
- generate_primes();
- //cout<<"1.1"<<endl;
- next_bit(); next_bit(); next_bit();//przeskoczyc co najmnien 3 pierwsze
- }
- bool empty()
- { return b; }
- uint32_t get()
- {
- uint32_t res=0;
- for (int i=0;i<32;i++)
- {
- res = res*2 + next_bit();
- }
- return res;
- }
- };
- int main()
- {
- test gen(10000000000ll);
- // uint64_t licznik=0;
- /* for (uint64_t i=0; i!=gen.tab.size();++i)
- {
- if (gen.tab[i]) licznik++;
- }*/
- while (!gen.empty())
- {
- uint64_t x=gen.get();
- cout.write((char*)&x,4);
- }
- // cout<<licznik<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement