Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let linearGenerator(seed: int) =
- let a = 16807;
- let m = int (System.Math.Pow(2.0, 31.0) - 1.0);
- let rec count(liczba: int, wynik: int) =
- if liczba=0 then wynik else count((liczba-liczba%10)/10, wynik+1);
- let index = count(m, 0);
- let rec generate(seedi: int, iter: int) =
- if iter=index then seedi else generate((a*seedi)%m, iter+1);
- generate(seed, 0);
- let toBinary(value: int) =
- let rec binary(vali: int, lista: List<int>) =
- if vali=0 then lista else binary((vali-vali%2)/2, vali%2::lista)
- binary(value, [])
- let addZero(listA: List<int>, max:int)=
- if listA.Length < max then
- [ for i in 1 .. (max-listA.Length) -> 0 ] @ listA
- else listA
- let cutter(n: int, list: List<_>) =
- let firstList = list |> Seq.take n |> Seq.toList
- let secondList = list |> Seq.skip n |> Seq.toList
- [|firstList; secondList|]
- let splitList(lista: List<int>, cut: int) =
- let rec split(result: List<List<int>>, value: List<int>) =
- if value.Length=0 then List.rev(result) elif value.Length<cut then value::result else split(cutter(cut, value).[0]::result, cutter(cut, value).[1])
- split([], lista)
- let possiblitiesList(num: int) =
- let rec pList(result: List<List<int>>, number: int) =
- if number<0 then result else pList(addZero(toBinary(number), num)::result, number-1)
- pList([], (System.Math.Pow(2.0, num|>float)-1.0)|>int)
- let expectedValue(L: int) =
- match L with
- | 1 -> 0.7326495;
- | 2 -> 1.5374383;
- | 3 -> 2.4016068;
- | 4 -> 3.3112247;
- | 5 -> 4.2534266;
- | 6 -> 5.2177052;
- | 7 -> 6.1962507;
- | 8 -> 7.1836656;
- | 9 -> 8.1764248;
- | 10 -> 9.1723243;
- | 11 -> 10.170032;
- | 12 -> 11.168765;
- | 13 -> 12.168070;
- | 14 -> 13.167693;
- | 15 -> 14.167488;
- | 16 -> 15.167379;
- | _ -> 0.0;
- let variance(L: int) =
- match L with
- | 1 -> 0.690;
- | 2 -> 1.338;
- | 3 -> 1.901;
- | 4 -> 2.358;
- | 5 -> 2.705;
- | 6 -> 2.954;
- | 7 -> 3.125;
- | 8 -> 3.238;
- | 9 -> 3.311;
- | 10 -> 3.356;
- | 11 -> 3.384;
- | 12 -> 3.401;
- | 13 -> 3.410;
- | 14 -> 3.416;
- | 15 -> 3.419;
- | 16 -> 3.421;
- | _ -> 0.0;
- let midpoint(funkcja:float->float,a:float,b:float,n:int)=
- let h = (b-a)/((float)n)
- let rec LiczCiag(funkcja:float->float,poprzedni:float,a:float,h:float,iter:int,n:int)=
- if iter < n then
- let mid = poprzedni+ h*(funkcja(a+(h/2.0)+((float )iter*h)))
- LiczCiag(funkcja,mid,a,h,iter+1,n)
- else
- poprzedni
- let ciag = LiczCiag(funkcja,0.0,a,h,1,n)
- ciag
- let erfc(limit: float) =
- let funk(x:float) = exp(-(x*x))
- let funk2(x:float) = (1.0/System.Math.Pow(x,2.0))*(funk(1.0/x))
- (2.0/System.Math.Sqrt(System.Math.PI))*midpoint(funk2,0.0,1.0/limit,1000)
- let mauersTester(L: int, Q: int, e: int) =
- let mutable eBin = toBinary(e);
- if not(eBin.Length%L=0) then eBin <- addZero(eBin, eBin.Length+(eBin.Length%L))
- let splittedList = splitList(eBin, L);
- let cutted = cutter(Q, splittedList);
- let initSegment = cutted.[0];
- let testSegment = cutted.[1];
- let possibleValues = possiblitiesList(L);
- let positionArray = Array.zeroCreate(possibleValues.Length);
- let rec fillPositionArray(pList: List<List<int>>, iter: int, pos: int) =
- if pList.Length=0 then pList
- else if iter=possibleValues.Length then fillPositionArray(pList.Tail, 0, pos+1)
- else if possibleValues.[iter] = pList.Head
- then positionArray.[iter] <- pos;
- fillPositionArray(pList.Tail, 0, pos+1);
- else fillPositionArray(pList, iter+1, pos)
- let l = fillPositionArray(initSegment, 0, 1);
- let sum = ref 0.0;
- let rec fillPositionArraySum(pList: List<List<int>>, iter: int, pos: int) =
- if pList.Length=0 then pList
- else if iter=possibleValues.Length then fillPositionArraySum(pList.Tail, 0, pos+1)
- else if possibleValues.[iter] = pList.Head
- then sum := sum.Value + System.Math.Log(((pos+Q)-positionArray.[iter])|>float, 2.0);
- positionArray.[iter] <- pos+Q;
- fillPositionArraySum(pList.Tail, 0, pos+1);
- else fillPositionArraySum(pList, iter+1, pos)
- let s = fillPositionArraySum(testSegment, 0, 1);
- let funk = sum.Value/(testSegment.Length|>float)
- let sigma = System.Math.Sqrt(variance(L));
- let limit = System.Math.Abs((funk-expectedValue(L))/(System.Math.Sqrt(2.0)*sigma))
- erfc(limit);
- let mauersTest(number : int, bits: int, testSize: int) =
- if mauersTester(bits, testSize, number)>0.01 then true else false;
- let makeTests =
- for i = 1 to 100 do printfn "%b" (mauersTest(linearGenerator(System.DateTime.Now.Millisecond),2, 4))
- (* Liczenie dla danych z książki
- let testC = mauersTester(2, 4, 370519)
- *)
- printfn "%A" makeTests
- System.Console.ReadKey(true);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement