mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| create or replace package prime#
 | |
| is
 | |
|   invalid_argument_error                          exception;
 | |
| 
 | |
|   function nth (
 | |
|     i_num                                         pls_integer
 | |
|   ) return number;
 | |
| end prime#;
 | |
| /
 | |
| 
 | |
| create or replace package body prime#
 | |
| is
 | |
|   type t_primes is table of number index by pls_integer;
 | |
|   b_primes                                       t_primes;
 | |
| 
 | |
|   function is_prime(
 | |
|     i_candidate                                   number
 | |
|   ) return boolean
 | |
|   is
 | |
|     l_num                           number := 1;
 | |
|     l_prime                         number;
 | |
|     l_result                        number;
 | |
|   begin
 | |
|   	if i_candidate < 2 then
 | |
|   	  return false;
 | |
|   	end if;
 | |
| 
 | |
|     loop
 | |
|       l_prime := nth(l_num);
 | |
|       if l_prime = i_candidate then
 | |
|         return true;
 | |
|       end if;
 | |
| 
 | |
|       l_result := i_candidate / l_prime;
 | |
|     	if l_result = ceil(l_result) then
 | |
|     	  return false;
 | |
|     	end if;
 | |
| 
 | |
|     	l_num := l_num + 1;
 | |
|     	exit when l_result <= l_prime;
 | |
|     end loop;
 | |
| 
 | |
|     return true;
 | |
|   end is_prime;
 | |
| 
 | |
|   function next (
 | |
|     i_prime                                       pls_integer
 | |
|   ) return number
 | |
|   is
 | |
|     l_next                          number;
 | |
|   begin
 | |
|     l_next := i_prime + case mod(i_prime, 2) when 0 then 1 else 2 end;
 | |
| 
 | |
|     while not is_prime(l_next) loop
 | |
|       l_next := l_next + 2;
 | |
|     end loop;
 | |
|     return l_next;
 | |
|   end next;
 | |
| 	
 | |
|   function nth (
 | |
|     i_num                                         pls_integer
 | |
|   ) return number
 | |
|   is
 | |
|     l_index                         number := 2;
 | |
|     l_prime                         number := 3;
 | |
|   begin
 | |
|     if   i_num < 1
 | |
|       or ceil(i_num) != i_num
 | |
|     then
 | |
|       raise invalid_argument_error;
 | |
|     end if;
 | |
| 
 | |
|     case i_num
 | |
|       when 1 then return 2;
 | |
|       else
 | |
|         if b_primes.exists(i_num) then
 | |
|           return b_primes(i_num);
 | |
|         end if;
 | |
|         while l_index < i_num loop
 | |
|           l_index := l_index + 1;
 | |
|           if b_primes.exists(l_index) then
 | |
|             l_prime := b_primes(l_index);
 | |
|           else
 | |
|             l_prime := next(l_prime);
 | |
|             b_primes(l_index) := l_prime;
 | |
|           end if;
 | |
|         end loop;
 | |
|         return l_prime;
 | |
|     end case;
 | |
|   end nth;
 | |
| 
 | |
| end prime#;
 | |
| / |