Advertisement
Guest User

pi

a guest
Oct 16th, 2018
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. real function log2(x)
  2.   implicit none
  3.   real, intent(in) :: x
  4.  
  5.   log2 = log(x) / log(2.)
  6. end function
  7.  
  8.  
  9. integer function find_number_of_primes(limit) result(number_primes)
  10.     implicit none
  11.     INTEGER, INTENT(IN) :: limit
  12.     INTEGER :: i, j
  13.     LOGICAL :: is_prime
  14.  
  15.     number_primes = 0
  16.  
  17.     DO i = 3,(limit-1)
  18.         is_prime = .TRUE.
  19.         DO j = 2, (i-1)
  20.             IF (MODULO(i, j) == 0) THEN
  21.                 is_prime = .FALSE.
  22.                 EXIT
  23.             END IF
  24.         END DO
  25.         IF (is_prime .EQV. .TRUE.) THEN
  26.         number_primes = number_primes + 1
  27.         END IF
  28.     END DO
  29. end function find_number_of_primes
  30.  
  31. SUBROUTINE get_primes(number_primes, primes)
  32.     IMPLICIT NONE
  33.     INTEGER, INTENT(IN) :: number_primes
  34.     INTEGER :: i, found_primes, j
  35.     LOGICAL:: is_prime
  36.     INTEGER, INTENT(OUT) :: primes(number_primes)
  37.     i = 3
  38.     found_primes = 0
  39.     DO
  40.     is_prime = .TRUE.
  41.     DO j = 2, (i-1)
  42.         IF (MODULO(i,j) == 0) THEN
  43.             is_prime = .FALSE.
  44.         END IF
  45.     END DO
  46.     IF (is_prime .EQV. .TRUE.) THEN
  47.         found_primes = found_primes + 1
  48.         primes(found_primes) = i
  49.         IF (found_primes == number_primes) EXIT
  50.     END IF
  51.     i = i + 1
  52.     END DO
  53.  
  54.  
  55. end SUBROUTINE get_primes
  56.  
  57. integer function multiplicity(a, b)
  58.     implicit none
  59.     INTEGER, INTENT(IN) :: a, b
  60.  
  61.     multiplicity = 0
  62.     DO
  63.         multiplicity = multiplicity + 1
  64.         IF (MOD(b, (a**(multiplicity+1))) /= 0) THEN
  65.             EXIT
  66.         END IF
  67.     END DO
  68. end function multiplicity
  69.  
  70.  
  71.  
  72. PROGRAM pi
  73.     IMPLICIT NONE
  74.     INTEGER :: find_number_of_primes, number_primes, last_digit, digit, N, &
  75.     eps, i, j, multiplicity, test
  76.     REAL :: log2, base, v_max, m, s, v, b, A, pi_sum
  77.     INTEGER, ALLOCATABLE :: primes(:)
  78.    
  79.    
  80.     digit = 3
  81.     eps = 2
  82.     base = 10
  83.     N = INT((digit+eps)*log2(base))
  84.     pi_sum = 0
  85.     number_primes = find_number_of_primes(2*N)
  86.     ALLOCATE(primes(number_primes))
  87.     CALL get_primes(number_primes, primes)
  88.    
  89.     DO i=1,SIZE(primes)
  90.     PRINT*,"************ ", "i =",i,"***************************"
  91.         v_max = INT(log(REAL(2*N))/log(REAL(primes(i))))
  92.         m = primes(i)**v_max
  93.         s = 0
  94.         v = 0
  95.         b = 1
  96.         A = 1
  97.         PRINT*, "v_max =", v_max
  98.         PRINT*, "m =", m
  99.         DO j = 1,(N)
  100.             PRINT*,"------------- ", "j =",j,"-------------------------------"
  101.             b = MOD((j/(primes(i)**multiplicity(digit, j)) * b), m)
  102.             PRINT*, "b =", b
  103.             A = MOD((2*j-1)/(primes(i)**multiplicity(primes(i), (2*j-1)))*A, m)
  104.             PRINT*, "A =", A
  105.             v = v - multiplicity(primes(i),j)+multiplicity(primes(i),(2*j-1))
  106.             PRINT*, "v =", v
  107.             IF (v > 0) THEN
  108.                 s = MOD(s*j*b*(A**(-1))*a**(v_max-v), m)
  109.                 PRINT*, "v > 0 --> s =", s
  110.             END IF
  111.         END DO
  112.         PRINT*, "------------------------------------------"
  113.         s = MOD(s * base**(digit-1), m)
  114.         PRINT*, "s nach schleife =", s
  115.         pi_sum = pi_sum + MOD((s/m), REAL(1))
  116.         PRINT*, "summe =", pi_sum
  117.     END DO
  118.    
  119.     PRINT*, pi_sum
  120.    
  121.     PRINT*, primes
  122.    
  123.     PRINT*, MOD(6, 4)
  124.    
  125. END PROGRAM
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement