Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let trialDivision (k:bigint) : bigint array =
- let n = abs(k)
- if n.IsZero || n.IsOne || n.Equals(2) then
- [|k; bigint.One|]
- elif n.IsEven then
- [|bigint.Divide(k, bigint 2); bigint 2|]
- else
- let rec iterate (dividend:bigint) (divisor:bigint) : bigint =
- if bigint.Remainder(dividend, divisor).IsZero then
- divisor
- else
- if bigint.Pow(divisor, 2).CompareTo(dividend) > 0 then
- dividend
- else
- iterate dividend (bigint.Add(divisor, bigint 2))
- let factor = iterate n (bigint 3)
- [|bigint.Divide(k, factor); factor|]
- let AsyncTrialDivision(k:bigint) : bigint array =
- let n = abs(k)
- if n.IsZero || n.IsOne || n.Equals(2) then
- [|k; bigint.One|]
- elif n.IsEven then
- [|bigint.Divide(k, bigint 2); bigint 2|]
- else
- let factor = ref k
- let parallelOption = new ParallelOptions()
- parallelOption.MaxDegreeOfParallelism <- 4;
- Parallel.ForEach(seq { for divisor in bigint 3 .. bigint 2 .. n -> divisor }, parallelOption, (fun (divisor:bigint) (loopState:ParallelLoopState) ->
- if bigint.Remainder(n, divisor).IsZero then
- factor := divisor
- loopState.Stop()
- ))
- |> ignore
- [|bigint.Divide(k, !factor); !factor|]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement