Advertisement
zhangsongcui

prime

Oct 20th, 2019
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.27 KB | None | 0 0
  1. use packed_simd::*;
  2.  
  3. fn try_divide(size: i32) -> i32 {
  4.     let mut primes = vec![f32x8::new(16777216f32, 16777216f32, 16777216f32, 16777216f32, 16777216f32, 16777216f32, 3f32, 2f32)];
  5.     let mut sqr = 2;
  6.     let max_sqr = f32::sqrt(size as f32) as i32;
  7.     let mut pos: i32 = 8 - 3;
  8.     let mut flag = true;
  9.     let mut current = 5;
  10.     let mut count = 2;
  11.  
  12.     while current <= size {
  13.         let num = f32x8::splat(current as f32);
  14.         if sqr * sqr <= current {
  15.             sqr += 1;
  16.         }
  17.  
  18.         for &divisor in primes.iter() {
  19.             if num % divisor == f32x8::splat(0f32) {
  20.                 break;
  21.             }
  22.             if divisor.extract(0) as i32 >= sqr {
  23.                 count += 1;
  24.                 if current <= max_sqr {
  25.                     *primes.last_mut().unwrap() = primes.last().unwrap().replace(pos as usize, current as f32);
  26.                     pos -= 1;
  27.                     if pos < 0 {
  28.                         primes.push(f32x8::splat(16777216f32));
  29.                         pos = 8 - 1;
  30.                     }
  31.                 }
  32.  
  33.                 break;
  34.             }
  35.         }
  36.  
  37.         flag = !flag;
  38.         current += if flag { 4 } else { 2 };
  39.     }
  40.  
  41.     count
  42. }
  43.  
  44. fn main() {
  45.     println!("{}", try_divide(100));
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement