Advertisement
Guest User

Untitled

a guest
Nov 20th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.42 KB | None | 0 0
  1. let trialDivision (k:bigint) : bigint array =
  2.     let n = abs(k)
  3.  
  4.     if n.IsZero || n.IsOne || n.Equals(2) then
  5.         [|k; bigint.One|]
  6.    
  7.     elif n.IsEven then
  8.         [|bigint.Divide(k, bigint 2); bigint 2|]
  9.  
  10.     else
  11.         let rec iterate (dividend:bigint) (divisor:bigint) : bigint =
  12.             if bigint.Remainder(dividend, divisor).IsZero then
  13.                 divisor
  14.             else
  15.                 if bigint.Pow(divisor, 2).CompareTo(dividend) > 0 then
  16.                     dividend
  17.                 else
  18.                     iterate dividend (bigint.Add(divisor, bigint 2))
  19.  
  20.         let factor = iterate n (bigint 3)
  21.         [|bigint.Divide(k, factor); factor|]
  22.  
  23.  
  24.  
  25.  
  26. let AsyncTrialDivision(k:bigint) : bigint array =
  27.     let n = abs(k)
  28.  
  29.     if n.IsZero || n.IsOne || n.Equals(2) then
  30.         [|k; bigint.One|]
  31.    
  32.     elif n.IsEven then
  33.         [|bigint.Divide(k, bigint 2); bigint 2|]
  34.  
  35.     else
  36.         let factor = ref k
  37.  
  38.         let parallelOption = new ParallelOptions()
  39.         parallelOption.MaxDegreeOfParallelism <- 4;
  40.  
  41.         Parallel.ForEach(seq { for divisor in bigint 3 .. bigint 2 .. n -> divisor }, parallelOption, (fun (divisor:bigint) (loopState:ParallelLoopState) ->
  42.             if bigint.Remainder(n, divisor).IsZero then
  43.                 factor := divisor
  44.                 loopState.Stop()
  45.         ))
  46.         |> ignore
  47.  
  48.         [|bigint.Divide(k, !factor); !factor|]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement