Advertisement
dgulczynski

299391 - Lab 16.10.17

Oct 16th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.39 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public final class LiczbyPierwsze
  5. {
  6.     private final static int POTEGA2 = 21;
  7.     private final static int[] SITO = new int[1<<POTEGA2] ;
  8.  
  9.     static{
  10.         for(int i=2; i < SITO.length; i++)
  11.             SITO[i]=i;
  12.  
  13.         for(int i=2; i*i < SITO.length; i++){
  14.             if(SITO[i]==i){
  15.                 for(int j = i; j*i< SITO.length; j++){
  16.                     if(SITO[i*j] > i)
  17.                         SITO[i*j]=i;
  18.                 }
  19.             }
  20.         }
  21.     }
  22.  
  23.     public static boolean czyPierwsza (long x){
  24.         if(x<2)
  25.             return false;
  26.         if(x < SITO.length){
  27.             if(SITO[(int)x]==x) return true;
  28.             else return false;
  29.         }
  30.         else
  31.         for(long i =2; i<SITO.length; i++)
  32.             if(SITO[(int)i]==i)
  33.                 if(x%i==0)
  34.                     return false;
  35.                
  36.         long stop = (long)(Math.sqrt(x)/6);    
  37.         for(long k=SITO.length/6L; k<stop; k++){
  38.             if(x%(6*k+1)==0)
  39.                 return false;
  40.             if(x%(6*k-1)==0)
  41.                 return false;
  42.         }
  43.         return true;
  44.     }
  45.  
  46.     public static long[] naCzynnikiPierwsze (long x){
  47.         List<Long> czynniki = new ArrayList<Long>(0);
  48.        
  49.         if(x==1 || x==0){
  50.             long c []= new long[1];
  51.             c[0]=x;
  52.             return c;
  53.         }
  54.         if(x<0){
  55.             czynniki.add(-1L);
  56.             x*=-1L;
  57.             if(x<0 && x%2==0){
  58.                     x/=2;
  59.                     x*=-1L;
  60.                     czynniki.add(2L);
  61.                 }
  62.                
  63.         }
  64.         if(x<SITO.length)
  65.             while(x>1){
  66.                 czynniki.add((long)(SITO[(int)x]));
  67.                 x=x/((long)(SITO[(int)x]));
  68.             }
  69.         else{            
  70.             for(long i = 2; i<SITO.length; i++)
  71.                 if(SITO[(int)i]==i && x%i==0){
  72.                     while(x%i==0){
  73.                         czynniki.add(i);
  74.                         x=x/i;
  75.                     }
  76.                     if(x==1)
  77.                         break;
  78.                 }
  79.                
  80.             long stop = (long)(Math.sqrt(x)/6);
  81.             for (long k=SITO.length/6L; k<stop; k++){
  82.                 if (x%(6*k+1)==0 || x%(6*k-1)==0){
  83.                     while(x%(6*k+1)==0){
  84.                         czynniki.add((6*k+1));
  85.                         x=x/(6*k+1);
  86.                     }
  87.                     while(x%(6*k-1)==0){
  88.                         czynniki.add((6*k-1));
  89.                         x=x/(6*k-1);
  90.                     }
  91.                     if(x==1)
  92.                         break;
  93.                     }
  94.                 }
  95.            
  96.             if(x>1)
  97.                 czynniki.add(x);
  98.         }
  99.         long c[]=new long[czynniki.size()];
  100.         for(int i =0; i<c.length; i++)
  101.             c[i]=czynniki.get(i);
  102.         return c;
  103.     }
  104.    
  105.     public static void main(String args[])
  106.     {
  107.         for(int i=0; i<args.length; i++)
  108.         {
  109.             long x=Long.valueOf(args[i]);
  110.             long[] czynnikiPierwsze = LiczbyPierwsze.naCzynnikiPierwsze(x);
  111.             System.out.print(x+" = ");            
  112.             if(czynnikiPierwsze.length==1)
  113.                 System.out.println(czynnikiPierwsze[0]);
  114.             else{
  115.                 for(int j =0; j<czynnikiPierwsze.length-1; j++)
  116.                     System.out.print(czynnikiPierwsze[j]+"*");
  117.                 System.out.println(czynnikiPierwsze[czynnikiPierwsze.length-1]);
  118.             }
  119.         }
  120.         if(args.length<1)
  121.             System.err.println("Nie podano liczby.\nAby rozlozyc liczby na czynniki pierwsze podaj je do programu za pomoca wiersza polecenia.\nObslugiwany zakres: [-2^63 ; 2^63-1]");
  122.     }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement