From e43f9661a9ebae5e82e75ebcdfe9708ade7c81d7 Mon Sep 17 00:00:00 2001 From: Haydar Demirhan Date: Thu, 25 Feb 2016 05:21:43 +0000 Subject: [PATCH] version 1.2.2 --- DESCRIPTION | 21 +- MD5 | 15 +- NAMESPACE | 92 ++-- R/KSADdga.R | 140 ++++-- build/vignette.rds | Bin 0 -> 210 bytes inst/doc/CryptRndTest.R | 128 ++++++ inst/doc/CryptRndTest.ltx | 740 ++++++++++++++++++++++++++++++ inst/doc/CryptRndTest.pdf | Bin 0 -> 179059 bytes man/CryptRndTest-package.Rd | 200 ++++---- vignettes/CryptRndTest.ltx | 737 +++++++++++++++++++++++++++++ vignettes/RJournal.sty | 335 ++++++++++++++ vignettes/demirhan_Crypt_2015.bib | 556 ++++++++++++++++++++++ 12 files changed, 2759 insertions(+), 205 deletions(-) create mode 100644 build/vignette.rds create mode 100644 inst/doc/CryptRndTest.R create mode 100644 inst/doc/CryptRndTest.ltx create mode 100644 inst/doc/CryptRndTest.pdf create mode 100644 vignettes/CryptRndTest.ltx create mode 100644 vignettes/RJournal.sty create mode 100644 vignettes/demirhan_Crypt_2015.bib diff --git a/DESCRIPTION b/DESCRIPTION index 3866b0a..d69c6a1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,15 +1,24 @@ Package: CryptRndTest Type: Package Title: Statistical Tests for Cryptographic Randomness -Version: 1.2.1 -Date: 2015-12-24 -Author: Haydar Demirhan +Version: 1.2.2 +Date: 2016-02-24 +Author: Haydar Demirhan Maintainer: Haydar Demirhan -Description: Performs cryptographic randomness tests on a sequence of random integers or bits. Included tests are greatest common divisor, birthday spacings, book stack, adaptive chi-square, topological binary, and three random walk tests. Tests except greatest common divisor and birthday spacings are not covered by standard test suites. In addition to the chi-square goodness-of-fit test, results of Anderson-Darling, Kolmogorov-Smirnov, and Jarque-Bera tests are also generated by some of the cryptographic randomness tests. +Description: Performs cryptographic randomness tests on a sequence of random + integers or bits. Included tests are greatest common divisor, birthday spacings, + book stack, adaptive chi-square, topological binary, and three random walk + tests. Tests except greatest common divisor and birthday spacings are not + covered by standard test suites. In addition to the chi-square goodness-of-fit + test, results of Anderson-Darling, Kolmogorov-Smirnov, and Jarque-Bera tests are + also generated by some of the cryptographic randomness tests. Depends: MissMech, kSamples, sfsmisc, Rmpfr, parallel Imports: LambertW, gmp, tseries, methods +Suggests: R.rsp +VignetteBuilder: R.rsp License: GPL-3 +RoxygenNote: 5.0.1 NeedsCompilation: no -Packaged: 2016-01-04 14:02:49 UTC; Stat +Packaged: 2016-02-25 00:43:41 UTC; e27752 Repository: CRAN -Date/Publication: 2016-01-04 15:28:45 +Date/Publication: 2016-02-25 05:21:43 diff --git a/MD5 b/MD5 index e0e0df2..81d36b8 100644 --- a/MD5 +++ b/MD5 @@ -1,5 +1,5 @@ -89ff16fe4b2d24a05939a1041d6e21b6 *DESCRIPTION -0963ce0eccb698dace2a13f4c2374f5f *NAMESPACE +03199ba4455b989c8d367957783882d4 *DESCRIPTION +035b07521282a5dcbd699cf539f54f18 *NAMESPACE a932de32fc9531dc82b578764ed2a871 *R/GCD.R 1b7c36ec62dbbabfecd8a2f51a23ac7b *R/GCD.big.R 991a5fdabd63162144bf066ae0239952 *R/GCD.q.R @@ -7,7 +7,7 @@ a932de32fc9531dc82b578764ed2a871 *R/GCD.R a9c19cd33bb198ae37669ed3d8a44bbb *R/GCD.test.default.R 39ca022cbc9abbd5e6b125cb5f31e925 *R/GCD.test.main.R 1d0b330f6fbf6df7cede853d1654702d *R/KSADCHRY.R -4b1f39183e0f932064e57c0e776e5489 *R/KSADdga.R +952870448e5ef997b933db99ba4402d8 *R/KSADdga.R 674b384db89264e1cd498000c1bf4cac *R/Random.walk.D.R 49b1ffdad04d96463b6e7fbdd2e509ae *R/Random.walk.G.R 44c5acbbf64b2ce7a6185ea1cfde1b75 *R/Random.walk.Y.R @@ -33,8 +33,12 @@ d4d7cf67230cf1eeaf304922e40e53d4 *R/random.walk.tests.main.R a32856d16ca0bc9115ff315de240a8b0 *R/topological.binary.R e2c3869bc7ac9778cc91f540ca626a02 *R/topological.binary.default.R eeff0d1eb017d5816107be7adb6fa1e6 *R/topological.binary.main.R +3f96c953126dc511038657340491a670 *build/vignette.rds +a081c6107dbe788e69580164ba1c7368 *inst/doc/CryptRndTest.R +93b0ef894967133ed0427fd90611779c *inst/doc/CryptRndTest.ltx +1397244805ae6826ae8e4f3515e33aab *inst/doc/CryptRndTest.pdf 9b78c028ccdde86a855a1044e308045d *man/CryptRndTest-internal.Rd -8417e8482197942e52749537d0abb273 *man/CryptRndTest-package.Rd +61329ef5035a31d2c475e5981b84307a *man/CryptRndTest-package.Rd 46426b0a1c9aa431340b333f7a425b58 *man/GCD.Rd 1dd353fe833e9128ba46aa48971c781c *man/GCD.big.Rd 1349f0f5ed2ad37201f883d75b3c06d0 *man/GCD.q.Rd @@ -49,3 +53,6 @@ ed00fe05150d9001fcbb4f69ff04419b *man/birthday.spacings.Rd 0f3a9dc2818890821b8f6c0ff1a1062d *man/toBaseTen.Rd cdd3c1619aeec3a159da599e83cc4008 *man/toBaseTwo.Rd f8273920ea3772dd41a149405b8315e7 *man/topological.binary.Rd +fd29af2a7284e285bc7fd559dadabfbb *vignettes/CryptRndTest.ltx +8466d084a9513a46d715c12f678763c4 *vignettes/RJournal.sty +c2519c816a850199cc2b2f70bfd65909 *vignettes/demirhan_Crypt_2015.bib diff --git a/NAMESPACE b/NAMESPACE index 0738db7..8b816e9 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,57 +1,49 @@ -exportPattern("^[[:alpha:]]+") +# Generated by roxygen2: do not edit by hand -importFrom(sfsmisc,digitsBase) - -importFrom(tseries,jarque.bera.test) - -importFrom(kSamples,ad.test) - -importFrom(MissMech,AndersonDarling) - -importFrom(LambertW,W) - -importFrom(gmp,Stirling2) - -importFrom(Rmpfr,mpfr) - -importFrom(Rmpfr,mpfrArray) - -importFrom(parallel,makePSOCKcluster) - -importFrom(parallel,setDefaultCluster) -importFrom(parallel,clusterExport) - -importFrom(parallel,parLapply) - -importFrom(parallel,stopCluster) - -importFrom("stats", "chisq.test", "dpois", "ks.test", "pchisq","rnorm", "runif") - -importFrom("methods", "new") - -importFrom("utils", "write.table") - -S3method(adaptive.chi.square,default) - -S3method(birthday.spacings,default) - -S3method(book.stack,default) - S3method(GCD.test,default) - -S3method(random.walk.tests,default) -S3method(topological.binary,default) - - +S3method(GCD.test,main) +S3method(adaptive.chi.square,default) S3method(adaptive.chi.square,main) - +S3method(birthday.spacings,default) S3method(birthday.spacings,main) - +S3method(book.stack,default) S3method(book.stack,main) - -S3method(GCD.test,main) - +S3method(print,CryptRndTest) +S3method(random.walk.tests,default) S3method(random.walk.tests,main) +S3method(topological.binary,default) S3method(topological.binary,main) - -S3method(print,CryptRndTest) +export(GCD) +export(GCD.big) +export(GCD.q) +export(GCD.test) +export(Strlng2) +export(TBT.criticalValue) +export(adaptive.chi.square) +export(birthday.spacings) +export(book.stack) +export(random.walk.tests) +export(toBaseTen) +export(toBaseTwo) +export(topological.binary) +importFrom(LambertW,W) +importFrom(MissMech,AndersonDarling) +importFrom(Rmpfr,mpfr) +importFrom(Rmpfr,mpfrArray) +importFrom(gmp,Stirling2) +importFrom(kSamples,ad.test) +importFrom(methods,new) +importFrom(parallel,clusterExport) +importFrom(parallel,makePSOCKcluster) +importFrom(parallel,parLapply) +importFrom(parallel,setDefaultCluster) +importFrom(parallel,stopCluster) +importFrom(sfsmisc,digitsBase) +importFrom(stats,chisq.test) +importFrom(stats,dpois) +importFrom(stats,ks.test) +importFrom(stats,pchisq) +importFrom(stats,rnorm) +importFrom(stats,runif) +importFrom(tseries,jarque.bera.test) +importFrom(utils,write.table) diff --git a/R/KSADdga.R b/R/KSADdga.R index 2ea0bee..810ca0f 100644 --- a/R/KSADdga.R +++ b/R/KSADdga.R @@ -1,46 +1,96 @@ -KSADdga=function(e,alfa,n,m,lambda,num.class=10){ - z=0 - expected=0 - p=0 - p[1:(num.class+1)]=dpois(0:num.class,lambda=lambda) - p[num.class+1]=p[num.class+1]+sum(dpois((num.class+1):1000,lambda=lambda)) - N=length(e) - expected=round(p*N) - if (sum(expected)!=N){ - expected[which.max(expected)]=expected[which.max(expected)]-(sum(expected)-N) - } - z=rep(0:(length(expected)-1),expected) - test=kSamples::ad.test(e,z,method="simulated",dist=FALSE,Nsim=1000) - ADtest=test$ad - if (min(ADtest[,3]) zcHD8tNh(ICfAdOy3Y5mlm|B_1;p_f_zsH*{nlx;++PeyaGE->5urP)C1WO#1T;VnE MCq^rlPQd{H0N%1=16){ + exc = TRUE + } + if (m>=32){ + hei = TRUE + } + if (m>=64){ + expn = TRUE + do.test.g = FALSE + } + RWT = random.walk.tests(x = sim.data.bit, B = m, Excursion = exc, + Expansion = expn, Height = hei, alpha = alpha) + result[6] = RWT$AD.result.Excursion + result[7] = RWT$AD.result.Expansion + result[8] = RWT$AD.result.Height + result[9] = RWT$KS.result.Excursion + result[10] = RWT$KS.result.Expansion + result[11] = RWT$KS.result.Height + result[12] = RWT$CS.result.Excursion + result[13] = RWT$CS.result.Expansion + result[14] = RWT$CS.result.Height + + if (m<=16){ + n = m*(2^(m/2)) #optimal length of sample that is composed of B-bit words + #given by Ryabko and Monarev (2005) + dat.BS = sim.data[1:round(n/m)] + BS = book.stack(A = dat.BS, B = m, k = n/m, alpha = alpha, bit = FALSE) + result[15] = BS$BS.result + } + + if (len%%2==1){ + len = len-1 + } + len2 = len/2 + if (m<=64){ + dat.new = array(NA, dim = c(len2,2)) + dat.new[1:len2,1] = sim.data[1:len2] + dat.new[1:len2,2] = sim.data[(len2+1):len] + }else { + dat.new = mpfrArray(NA, prec = m, dim = c(len2,2)) + dat.new[1:len2,1] = sim.data[1:len2] + dat.new[1:len2,2] = sim.data[(len2+1):len] + } + EBOB=GCD.test(x = dat.new, B = m, mu = mu.GCD, sd = sd.GCD, test.g = do.test.g) + result[16] = EBOB$KS.result.k + result[17] = EBOB$CSQ.result.k + result[18] = EBOB$AD.result.k + result[19] = EBOB$JB.result.k + if (m<=64){ + result[20] = EBOB$KS.result.g + result[21] = EBOB$CSQ.result.g + } + return(result) +} +#---------------------------------------------------------------- \ No newline at end of file diff --git a/inst/doc/CryptRndTest.ltx b/inst/doc/CryptRndTest.ltx new file mode 100644 index 0000000..e8c3718 --- /dev/null +++ b/inst/doc/CryptRndTest.ltx @@ -0,0 +1,740 @@ +\documentclass[a4paper]{report} +%\VignetteIndexEntry{Details of CryptRndTest Package} +%\VignetteEngine{R.rsp::tex} + +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{RJournal} +\usepackage{amsmath,amssymb,array} +\usepackage{booktabs} + +\begin{document} +\sectionhead{Vignette for CryptRndTest} +\volume{} +\volnumber{} +\year{} +\month{} +\begin{article} + +\title{CryptRndTest: An R package for testing the cryptographic randomness} +\author{Haydar Demirhan\footnote{Corresponding author. e-mail:haydar.demirhan@rmit.edu.au}\\ + Hacettepe University, Department of Statistics\\ + 06800 Beytepe Ankara Turkey\\ + and\\ + RMIT University, School of Science\\ + Mathematical and Geospatial Sciences\\ 3001 Melbourne Australia\\ + \\ + Nihan Bitirim\\ + Council of Higher Education\\ + 06800 Cankaya Ankara\\ + Turkey} + +\maketitle + +\abstract{In this article, we introduce the R package CryptRndTest that performs eight statistical randomness tests on cryptographic random number sequences. The purpose of the package is to provide a software for the application of recently proposed cryptographic randomness tests utilizing goodness-of-fit tests superior to the frequently used chi-square test in terms of statistical performance. Most of the tests included by CryptRndTest are not conducted by available software such as the R package RDieHarder or the C library TestU01. Chi-square, Anderson-Darling, Kolmogorov-Smirnov, and Jarque-Bera goodness-of-fit procedures are applied along with cryptographic randomness tests. CryptRndTest utilizes multiple precision floating numbers for sequences longer than 64-bit by the use of package Rmpfr. By this way, included tests are applied precisely for higher bit-lengths. CryptRndTest provides a user friendly interface for eight existing and recently proposed cryptographic randomness tests. As an illustrative application, CryptRndTest is used to test available random number generators in R.} + + +%\symbolfootnote[0]{This work is fully supported by The Scientific and Technological Research Council of Turkey (TUBITAK) under Grant No. 114F249 of %ARDEB-3001 programme.} + + +\section{Introduction} + +Cyptographic random numbers constitute the heart of ciphering processes. Security of the transmitted information is mostly based on the quality of random numbers used to cipher the information. Due to the efficiency considerations, pseudo random numbers that ensure some hard-to-achieve properties are used for ciphering in practice. There are a considerable amount of pseudo random number generators (RNG's) in the literature of cryptography. Suitability of these RNG's for use in cryptographic applications is evaluated by using statistical randomness tests that are specifically designed to test randomness at the level required for ciphering processes. + +In a cryptographic randomness test, first, empirical distribution of a test statistic is obtained over a random number sequence by various data manipulations. Then, a statistical goodness-of-fit test is applied to evaluate significance of the difference between the empirical distribution and its theoretical counterpart at a predetermined level of significance. The need for a certain level of randomness to ensure unpredictability in cryptographic randomness context makes checking cryptographic and classical randomness different from each other. The manipulations of random number sequences make the cryptographic randomness tests more sensitive to small deviations from the exact randomness than their classical counterparts. The null hypothesis of the test is "$H_{0}:$ Sequences generated by the RNG of interest are random." There are more than a hundred alternative tests for the evaluation of cryptographic randomness \citep{lecuyer1998}. + +In the literature, some of these tests are grouped in test batteries or test suites \citep{lecuyer2007,marsaglia}. A detailed review of test batteries is given by \citet{demirhan15}. To be qualified as suitable, an RNG should be identified as random in a predetermined portion or all of the tests in a test battery. The basic test battery is introduced by \citet{Knuth1998,Knuth1981,Knuth1969}. Then, \citet{diehard} introduced the Diehard test battery composed of 12 randomness tests. Disadvantages of Diehard test battery were overcame by another test battery called Dieharder that is introduced by \citet{bronw14}. Dieharder includes 26 cryptographic randomness tests. It is an improvement of Diehard battery, provides a user friendly interface, and a useful and open source toolset for users of random numbers \citep{bronw14}. The Dieharder test battery is implemented by the R package \CRANpkg{RDieHarder} prepared by \citet{eddelbuettel_bronw}. At the time of writing, Windows and OS X binaries are not available for this package. US National Institute of Standards and Technology developed the NIST battery composed of 16 tests \citep{sys14,sys14_2,rukhinetal10,rukhin,soto99}. The NIST battery is still used as a straightforward tool for formal certifications and accepted as a standard test battery. \citet{sadique} review the tests included in NIST test battery. A suite of test batteries, TestU01, is introduced by \citet{lecuyer2007,testu01}. TestU01 is a C library that combines most of the available randomness tests and RNGs in six test batteries \citep{mccullough,lecuyer2007}. There are also smaller scale test batteries in terms of extensiveness. ENT is proposed by \citet{ent} that has 5 statistics and tests. The Helsinki test battery is based on Ising model and random walks on lattices and proposed by \citet{vattulainen}. The Crypt-X test battery, which includes 6 tests, is developed by Information Security Research Center at Queensland University of Technology \citep{sys14_2,soto99}. SPRNG test battery includes some tests from the battery of Knuth \citep{mascagni}. \citet{rutti} combined Knuth, Helsinki, Diehard, and SPRNG batteries and proposed a test battery consisting of 37 statistical and physical tests. + +In addition to the tests included by test batteries, there are recently proposed cryptographic randomness tests that are not performed by test batteries. \citet{maurer} proposed a statistical test for random bit generators. \citet{hernandez} proposed a new test called Strict Avalanche Criterion (SAC). \citet{ryabko2004} proposed an adaptation of well-known chi-square test. This test is more efficient than the usual chi-square test in small samples. ``Book Stack" and ``Order" tests were proposed by \citet{ryabko2005} for testing binary random bit sequences. \citet{doganaksoy06} proposed three randomness tests based on random walk process. Advantage of these tests is that it is possible to calculate exact probabilities corresponding to the test statistics. ``Topological Binary Test" was introduced by \cite{alcover} to test randomness in bit sequences. It counts different bit patterns of pre-determined length in a sequence of random bits. + +Availability of a software for the implementation of a test battery or even that of an individual cryptographic randomness test is a critical issue on the usefulness of related test or battery. The library TestU01 is developed on ANSI C; hence, it is compiled by GNU tools instead of today's C compilers. Although TestU01 performs a wide variety of tests and their combinations, it lacks flexibility of implementation. Because the battery Dieharder is implemented by an R package, namely \CRANpkg{RDieHarder}, it is more applicable and user-friendly than TestU01. However, unavailability of Windows and OS X binaries can be seen as a disadvantage that decreases its accessibility. A package for the implementation of the NIST battery is prepared on SUN workstation using ANSI C \citep{rukhinetal10}. \citet{rukhinetal10} provides a user guide for setting up the package and running the included tests. Ease of implementation of NIST battery is similar with TestU01. For the implementation of individual randomness tests, there are also numerous R packages such as \CRANpkg{randtests} or \CRANpkg{DescTools}. Although some of the tests included by these packages are also used to evaluate cryptographic randomness, they cover neither recently proposed tests nor those developed specifically to test cryptographic randomness. + +The usual chi-square test is applied with nearly all of the cryptographic randomness tests in the literature. The mentioned implementations including those covered by R automatically apply chi-square test. However, there are numerous alternatives to chi-square goodness-of-fit test such as Kolmogorov-Smirnov, Anderson-Darling, or Jarque-Bera. It is apparent that because statistical qualities of these tests are better than the chi-square test, there will be a gain in performance of cryptographic randomness tests applied with better goodness-of-fit tests. Thus, we need a software that is capable of conducting actual cryptographic randomness tests such as topological binary, book stack, etc. with goodness-of-fit tests better than usual chi-square in statistical performance. When the range and variety of cryptographic randomness tests implemented by software and practicability of available software are considered, the new software should effectively implement new tests with various goodness-of-fit tests and has a user-friendly interface. The package \CRANpkg{CryptRndTest} contributes to satisfy this need. + +The aim of this article is to describe and illustrate use of the R package \CRANpkg{CryptRndTest} (currently in version 1.2.2) that performs some of recently proposed and basic cryptographic randomness tests. The article is mainly based on the paper of \citet{demirhan16}. The package includes the functions \code{adaptive.chi.square}, \code{birthday.spacings}, \code{book.stack}, \code{GCD.test}, \code{topological.binary}, and \code{random.walk.tests} to perform adaptive chi-square, birthday spacing's, book stack, greatest common divisor, topological binary tests, and three tests based on the random walk process, respectively. To the best of our knowledge, the adaptive chi-square, topological binary, and the tests based on the random walk process are first implemented by a software in \CRANpkg{CryptRndTest}. In addition to the chi-square procedure, these functions apply Anderson-Darling, Kolmogorov-Smirnov, and Jarque-Bera procedures when suitable. Because statistical performances of goodness-of-fit tests differ under various conditions, application of different goodness-of-fit procedures is a beneficial feature. This is another important utility of \CRANpkg{CryptRndTest}. In addition, it has the following auxiliary functions: \code{GCD}, \code{GCD.q}, \code{GCD.big}, \code{Strlng2}, \code{toBaseTwo}, \code{toBaseTen}, and \code{TBT.criticalValue} to compute greatest common divisor under different conditions of inputs, approximately calculate the Stirling number of the second kind when the inputs are large, make base conversions precisely with large inputs, and calculate critical values for topological binary test. + +The paper is organized as follows: in the next section methodology of the tests included in \CRANpkg{CryptRndTest} is briefly given. Details of algorithms used to manipulate integer and bit sequences are mentioned, and applications of goodness-of-fit procedures performed by \CRANpkg{CryptRndTest} are clarified. Parameter settings and limitations for each test are mentioned. Finally, as an illustrative application of \CRANpkg{CryptRndTest}, random number generators available in R are tested by using the proposed package under different sequence and bit-length conditions. By this application, implementation performance of the package is analyzed, recently proposed tests are evaluated, and usage of functions of \CRANpkg{CryptRndTest} is illustrated. + +\section{Performed tests} + +\subsection{Adaptive chi-square} + +Adaptive chi-square test is introduced by \citet{ryabko2004}. It is empirically demonstrated by \citet{ryabko2004} that the adaptive chi-square test is more efficient than the classical chi-square test in the identification of non-random patterns in samples smaller than those required by the chi-square test. For example, when we work with 64-bit numbers the length of the alphabet is $2^{64}$; hence, we need to have a sequence of length greater than $5\cdot 2^{64}$ to apply the classical chi-square test safely. The logic behind the test is to divide the alphabet into subsets and perform chi-square test over subsets instead of individual elements of the sample. By this way, subsets are considered as a new alphabet and a new null hypothesis and its alternative are formed over the subsets. Because the number of categories required to test new hypotheses is equal to the number of subsets, the chi-square test is applied with much smaller samples. To conclude randomness, it is expected to observe a uniformity in the distribution of input numbers into the subsets. Deviations from this uniformity is detected by the adaptive chi-square test. + +The function \code{adaptive.chi.square()} is called to apply the test. It implements the following pseudo-code algorithm: \\ + +\noindent{\bf Algorithm 1.} +\begin{enumerate} + \item Input data as a matrix of bits or a vector of integers, the number of subsets $(S)$ that the alphabet will be divided into, and proportion of training data set; + \item If data is represented by bits, transform data to base-10; + \item Divide whole data set into training and testing subsets with regarding input weights; + \item Identify the numbers that are seen in the sequence of interest at least once; + \item Find the frequency of occurrences for each element of alphabet in training and testing subsets; + \item For $i=1,\dots,S$, find the frequency of elements that are seen $i$-times in the training and testing subsets; + \item Apply the two-sample chi-square test with the expected and observed counts obtained at the previous step over the training and testing subsets, respectively; + \item Return value of the test statistic, corresponding p-value, and the decision on the null hypothesis. +\end{enumerate} + +While working with integers, the alphabet corresponds to the range of considered numbers. For instance, if 32-bit numbers are being tested, the alphabet in Algorithm 1 includes the numbers between 0 and $2^{32}-1$. At step 4, we do not form whole alphabet, instead we count the numbers (words) that are seen at least once; and hence, the rest of the numbers have zero count. At step 7, the degrees of freedom of the test is $S-1$. + +Parameters of the adaptive chi-square test are: weight of training and testing samples ($r$), the length of the considered number sequence ($n$), and the number of subsets ($S$) that the alphabet is divided into. \citet{ryabko2004} do not give strict rules for the determination of values of these parameters. They suggest to run some experiments to find the values of parameters that provide the highest statistical performance such as power and specificity. Because such a study would not be cost-effective for an individual application of the test, at least, the user may evaluate sensitivity of test results to the values of $S$ and $r$. In the function \code{adaptive.chi.square()}, we set $r=0.5$ by default. The value of $S$ is set by user. That of $n$ is determined by the length of input data. Because input data is a random sample from the RNG of interest, the value of $n$ should be increased with increasing bit-length to successfully represent the range of numbers that will be generated by the RNG. When bit-length is greater than 64, we utilize the package \CRANpkg{Rmpfr} to work with higher precision. + +Algorithm complexity of the function \code{adaptive.chi.square()} is $O(n^{2})$ in the worst case. Required memory is directly related with the length of input sequence. Due to the algorithm complexity of the function used to identify unique numbers at step 4, implementation time of the function \code{adaptive.chi.square} increases quadratically along with the length of input sequence. + +\subsection{Birthday Spacings} + +The Birthday Spacings test is given by \citet{marsaglia}. It focuses on the number of duplicated values of spacings between ordered birthdays among a year of pre-determined length. The observed duplication patterns in input numbers are compared with the patterns that should be observed under randomness. Thus, birthday spacings test detects deviations from randomness by focusing on repetition frequency of numbers to ensure uniformity. \citet{marsaglia} propose that the number of duplicated values is approximately distributed according to the Poisson distribution. They also derive an expression for the mean rate of the Poisson distribution. + +The function \code{birthday.spacings()} is employed to run the test. It implements the following pseudo-code algorithm: \\ + +\noindent{\bf Algorithm 2.} +\begin{enumerate} + \item Input data as a vector of integers of size $n$, the number of birthdays $(m)$, the length of year $(N)$, the mean rate of the theoretical Poisson distribution $(\lambda)$, and the number of classes $(k)$ that is constructed for goodness-of-fit tests; + \item Reshape the first $m\cdot\lfloor n/m\rfloor$ elements of input vector as a matrix of $\lfloor n/m\rfloor$ rows and $m$ columns; + \item Sort each row of the matrix of step 2 according to the values in columns; + \item For each row, find the distance between columns of the sorted matrix by extracting the values in the columns at the previous step; + \item Count duplicated values among the distances obtained at step 4; + \item Calculate class probabilities over the Poisson distribution with mean rate $\lambda$ for $x=0,\dots,k$, and assign the rest of probability mass to the $(k+1)$-th class; + \item Calculate expected frequencies corresponding to the probabilities obtained at the previous step; + \item Replicate the expected counts to form the corresponding sample; + \item Apply the Anderson-Darling test to compare goodness-of-fit of the samples obtained at steps 5 and 8; + \item Apply the Kolmogorov-Smirnov test to compare goodness-of-fit of the samples obtained at steps 5 and 8; + \item Construct frequency table of the counts obtained at step 5; + \item Apply chi-square test over the frequency tables obtained at steps 7 and 11; + \item Return the values of test statistics, corresponding p-values, and decisions on the null hypothesis. +\end{enumerate} + +At step 2 of Algorithm 2, each row of the reshaped matrix includes birthdays in columns. Total number of rows determines the size of sample that is used in goodness-of-fit tests applied at steps 9, 10, and 12. Manipulation of the input vector according to the birthday spacings test is completed at step 5. This manipulation produces the empirical sample in testing the goodness-of-fit to Poisson distribution. The Anderson-Darling test at step 9 is applied by using function \code{ad.test} from the package \CRANpkg{ksamples}. The Kolmogorov-Smirnov test at step 10 is applied by using function \code{ks.test} from the package \CRANpkg{stats}. + +\citet{marsaglia} give some insight into the optimal values of parameters. The mean rate is $\lambda=m^{3}/(4n)$. They state that for an RNG, it is harder to pass this test for increasing values of either $m$ or $n$. Specifically, the case with $m=4096$ and $n=2^{32}$ is qualified as a compelling setting for 32-bit generators. Length of the input sequence is another important parameter. Because the size of sample used in testing the goodness-of-fit is equal to $\lfloor n/m\rfloor$, the length of the input sequence ($n$) should be chosen large enough to apply the goodness-of-fit tests appropriately. + +Algorithm complexity of the function \code{birthday.spacings()} is $O(n^{2})$ in the worst case. The limitation of \code{birthday.spacings()} is directly related with the value of $m$. For all combinations of $m$ and $n$ suggested by \citet{marsaglia}, $\lambda$ is equal to 4. Following this logic, when $n=2^{64}$ the value of $m$ giving $\lambda=4$ is 6,658,043. In this case, for a reliable application of goodness-of-fit tests at steps 9, 10, and 12, we need at least 133,160,860 integers and correspondingly 8,522,295,040 bits. For bit lengths higher than 32, the value of $\lambda$ can be taken as 2. For instance, when $n=2^{64}$, the corresponding value of $m$ is 5,284,492. Thus, decreasing the value of $\lambda$ does not overcome the need for a huge data set for a reliable testing. Note that use of huge data set for testing is a memory consuming operation. + +\subsection{Book Stack} + +The Book Stack test is proposed by \citet{ryabko2005}. Positions of the numbers on a stack are taken into consideration. In this test, randomness implies that frequency of finding each number at each position is equally likely. Departures from this equality mean that some of the words are seen more frequently in contrast to the nature of randomness. The book stack test focuses on non-uniform patterns and frequent repetitions of input numbers to detect deviations from randomness by means of unexpected autocorrelation patterns and non-uniformity. + +The function \code{book.stack()} implements the following pseudo-code algorithm to run the test: \\ + +\noindent{\bf Algorithm 3.} +\begin{enumerate} + \item Input data as a matrix of bits or a vector of integers and the number of subsets $(k)$ that the alphabet will be divided into; + \item If data is represented by bits, transform data to base-10; + \item Form an array that includes the numbers from 1 to the number of unique words in the input sequence; + \item Write each element of the input vector in place of the first element of the array formed at the previous step, and move the other elements except the one written to the first cell of the array one step right; + \item Record the array obtained at the previous step; + \item Go back to step 4 until all elements of the input vector are taken into account; + \item Divide the whole alphabet into $k$ non-overlapping subsets $(A_{1},A_{2},\dots,A_{k})$; + \item For each subset of alphabet, find the frequency of occurrences of the number corresponding to the position of each element of input vector in the arrays formed at steps 4 and 5; + \item Apply chi-square test with expected counts equal to $n\cdot A_{i}$, where $i=1,\dots,k$ and $n$ is the length of input vector or number of columns of input matrix; + \item Return the value of test statistic, corresponding p-value, and decision on the null hypothesis. +\end{enumerate} + +In order to get an integer number of subsets, the length of input vector should be determined to get an integer as the length of subsets. Optimal value for the length of input vector is given as $n\approx B\cdot 2^{B/2}$, where $B$ is the bit-length of considered RNG \citep{ryabko2005,ryabko2006,ryabko2006_2}. For an appropriate determination of number of subsets, $k$, \citet{ryabko2005} suggest performing an empirical study. As for an appropriate bit-length, it is mentioned by \citet{ryabko2005} that it is hard to set up a sensible test with much higher bit-lengths. + +Algorithm complexity of the function \code{book.stack()} is $O(n^{2})$ in the worst case. The limitation of the Book Stack test is based on the bit-length of considered RNG. For example, for $B=64$ the length of input vector is calculated as $1.37\cdot 10^{11}$ and we need 1 terabyte memory whereas the memory requirement is 4 megabytes for $B=32$. Due to both memory and sensibility issues, it is not appropriate to work with high bit-lengths such as 64. + +\subsection{Greatest Common Divisor} + +There are two tests proposed by \citet{marsaglia} and based on the number of required iterations $(k)$ and the value of greatest common divisor (GCD) obtained in the GCD operation. When perceived as random variables, both $k$ and GCD are independently and identically distributed and their distributions can be obtained under randomness. \citet{marsaglia} derived distributions of $k$ with an empirical study and that of GCD theoretically under the null hypothesis of randomness. Departures from randomness imply nonconformity between empirical and theoretical distributions of $k$ and GCD. Thus, these tests focus on the deviations from independence and uniformity. + +The function \code{gcd.test()} is called to apply the test. The following pseudo-code algorithm is implemented by \code{gcd.test()} when all of the goodness-of-fit tests are set to \code{TRUE}: \\ + +\noindent{\bf Algorithm 4.} +\begin{enumerate} + \item Input data as an $N\times 2$ matrix of integers, mean and standard deviation of theoretical normal distribution of $k$; + \item Constitute a pair of numbers from each row of input matrix; + \item Apply GCD operation to each pair formed at the previous step; + \item Store values of $k$ for $N$ pairs; + \item If obtained GCD is less than 3, store it as 3 and if that of GCD is greater than 35, store it as 35; + \item Generate a random sample of size $N$ from normal distribution with input values of mean and standard deviation. + \item If the tests based on $k$ will be conducted, go to the next step, otherwise go to step 13; + \item Apply the two sample Kolmogorov-Smirnov test in a two-sided setting to samples obtained at steps 4 and 6; + \item Apply the chi-square test to samples obtained at steps 4 and 6; + \item Standardize the values of $k$ by using its empirical mean and standard deviation; + \item Apply the Jarque-Bera test to the standardized sample of step 10; + \item Apply the Anderson-Darling test to samples obtained at steps 4 and 6; + \item If the tests based on GCD will be conducted, go to the next step, otherwise go to step 19; + \item Construct the cumulative distribution function (cdf) of the probability function (pf) of GCD given by \citet{marsaglia}. + \item Obtain theoretical frequencies for GCD over the cdf of step 14. Specifically, if theoretical frequency of GCD is less than 3, store it as 3 and if that of GCD is greater than 35, store it as 35; + \item Replicate the expected counts to form the corresponding sample; + \item Apply the two sample Kolmogorov-Smirnov test in a two-sided setting to samples obtained at steps 5 and 16; + \item Apply the chi-square test to samples obtained at steps 5 and 16; + \item Return the values of calculated test statistics, corresponding p-values, and decisions on the null hypothesis. +\end{enumerate} + +Mean and standard deviation of theoretical normal distribution for bit lengths other than 32 are not given by \citet{marsaglia}. We conducted extensive empirical studies, details of which are mentioned in following sections, to obtain these parameters and tabulated obtained values in Table \ref{tbl5}. + +When bit-length is increased, corresponding value of GCD mostly becomes greater than 35; hence, the operation at step 15 of Algorithm 4 gets unreasonable. Thus, we observe that it is not appropriate to conduct tests based on GCD for high bit-lengths such as 128. + +The Kolmogorov-Smirnov and chi-square tests at steps 8 and 17, and 9 and 18 are applied by using functions \code{ks.test} and \code{chisq.test} from the package \CRANpkg{stats}, respectively. The Jarque-Bera test at step 11 is implemented by using the function \code{jarque.bera.test} from the package \CRANpkg{tseries}. The Anderson-Darling test is applied by using the function \code{ad.test} from the package \CRANpkg{ksamples}. + +Calculation of the number of required iterations and the value of GCD are time consuming tasks for bit-lengths greater than 64. To overcome this difficulty, we prepared three functions to calculate GCD-related variables. The first function \code{GCD.q} computes the number of required iterations, the value of GCD, and the sequence of partial quotients by using the Euclidean algorithm. The function \code{GCD} is the recursive version of the Euclidean algorithm and it only provides the number of required iterations and the value of GCD. The function \code{GCD.big} applies the Euclidean algorithm over multiple precision floating point numbers using the \CRANpkg{Rmpfr} and provides all three outputs related with the GCD operation. While \code{GCD} is the fastest one, \code{GCD.big} gives the most precise results. It is also possible to use the binary GCD algorithm to decrease the implementation time. However, in this case it is not possible to apply tests over the number of required iterations of the Euclidean algorithm. When the GCD operation is done recursively, the algorithm complexity of \code{gcd.test()} is $O(\log(a))$, where $a$ is the maximum initial input to the recursive algorithm. Memory requirement for GCD tests is directly related with the value of $N$. + +\subsection{Random walk tests} + +In the literature, binary sequences are analyzed in detail by using random walk process. \citet{doganaksoy06} propose three tests based on the random walk stochastic process. In a random walk process, magnitude or direction of each change is determined by chance; hence, a random walk is random if increment and decrement probabilities are equal to each other. Therefore, random walk processes provide a good basis for randomness. In a random walk, a part of sequence that intersects the $x$-axis with two successive points is called excursion, and over all excursions, the maximum distance from the $x$-axis is defined as height, and the vertical distance between minimum and maximum points over $y$-axis is called expansion. Thus, we have three characteristics of random walk process to observe deviations from randomness. The corresponding tests are called Random Walk Excursion, Random Walk Height, and Random Walk Expansion. If there is a trend in the process, input sequence fails in the excursion test. The height test focuses on the moves with very low or high magnitude to detect non-randomness. The expansion test focuses on the anomalies in amplitude of the walk to identify non-random patterns. Because the exact probabilities corresponding to test statistics are calculated, the tests proposed by \citet{doganaksoy06} are also applicable for small sample sizes. + +The function \code{random.walk.tests()} is called to apply three tests, selectively. The following pseudo-code algorithm is implemented by \code{random.walk.tests()} when all of the tests are to be applied: \\ + +\noindent{\bf Algorithm 5.} +\begin{enumerate} + \item Input data as a matrix of bits of dimension $B\times k$, where $B$ is the bit length and $k$ is the length of input sequence; + \item Transform the input values from $\{0,1\}$ to $\{-1,1\}$; + \item To apply the expansion, excursion, and height tests go to steps 4, 6, and 7, respectively; + \item For each non-overlapping set of length $B$, sum adjacent bits starting from the first bit and increasing by one at each iteration (By this way, we get $B$ summations for each number of interest). + \item For the Expansion test, count and store the summations of the previous step equal to zero; + \item For the Excursion test, calculate the maximum summation and the absolute value of the minimum summation among those of step 4 and store their sum; + \item For the Height test, store absolute maximum of summations obtained at step 4; + \item Calculate theoretical cdf's and pf's for the tests regarding bit-lengths and probabilities tabulated by \citet{doganaksoy06}. + \item Calculate empirical cdf's and pf's over the counts obtained at steps 5, 6, and 7; + \item Replicate the expected and empirical pf's to form the corresponding samples; + \item Apply the Anderson-Darling test to samples obtained at the previous step; + \item Apply the two sample Kolmogorov-Smirnov test in a two-sided setting to samples obtained at step 10; + \item Apply the chi-square test to samples obtained at step 10; + \item Return the values of calculated test statistics, corresponding p-values, and decisions on the null hypothesis. + +\end{enumerate} + +The Anderson-Darling test at step 9 is applied by using function \code{ad.test} from the package \CRANpkg{ksamples}. The Kolmogorov-Smirnov test at step 10 is applied by using function \code{ks.test} from the package \CRANpkg{stats}. The chi-square test at step 11 is the classical application of the test without using a predefined function. If one of the tests is not applied, all the results related with that test in output are set to -1. + +Algorithm complexities of expansion, excursion, and height tests are $O(B)$, $O(B\lfloor k\cdot B\rfloor)$, and $O(B\lfloor k\cdot B\rfloor)$, respectively. The limitation of the tests is unavailability of theoretical cdf's for bit-lengths other than 32, 64, 128, and 256. Therefore, using the information given by \citet{doganaksoy06} the excursion is applied for bit-lengths of 16, 32, 64, 128, and 256; the height test is applied for bit-lengths of 64, 128, 256, 512, and 1024; and the expansion test is applied for bit-lengths of 32, 64, and 128. Although the required memory increases along with the length of input sequence, it is possible to apply the tests with reasonable sequence lengths without causing memory pressure. + +\subsection{Topological binary} + +The topological binary test is proposed by \citet{alcover} to test the randomness in bit sequences. The logic behind the test is based on the number of different fixed-length bit patterns in a bit sequence. Frequency of distinct non-overlapping bit patterns over the sequence of interest is influential on the test result. In case of randomness, we expect to have many different bit patterns in the input sequence. The main strength of the topological binary test is that it focuses on the number of bit patterns rather than frequency of occurrence of numbers. Because the exact distribution of test statistic is derived, it is possible to apply the test for short bit sequences. + +The function \code{topological.binary()} implements the following pseudo-code algorithm to run the test: \\ + +\noindent{\bf Algorithm 6.} +\begin{enumerate} + \item Input data as a $B\times k$ matrix of bits, where $B$ is the bit-length and $k$ is the length of considered number sequence, and the critical value; + \item Find and store non-overlapping blocks of length $B$; + \item Count the number of different $B$-bit patterns that appear across all the $k$ blocks; + \item If the result of step 3 is less than one, then reject the null hypothesis; + \item else if the result of step 3 is greater than $\min(k,2^{B})$, then do not reject the null hypothesis; + \item else if the result of step 3 is less than the input critical value, then reject the null hypothesis; + \item else do not reject the null hypothesis; + \item Return the result of step 3 as the value of test statistic and the decision on the null hypothesis. +\end{enumerate} + +Although the exact distribution of test statistic is derived by \citet{alcover}, calculation of the Stirling numbers of the second kind with large inputs is required with bit-lengths greater than 16 for the calculation of cdf of the tests statistic. Therefore, it is hard to obtain the critical value of the test for large bit-lengths by using available functions in R packages such as the function \code{Stirling2} of \CRANpkg{copula}. This case is a limitation of the function \code{topological.binary()}. To overcome this limitation of the test, we prepared the function \code{TBT.CriticalValue} to calculate required critical values for testing. Algorithm complexity of the function \code{topological.binary()} is $O(n^{2})$ in the worst case. The required memory to run the topological binary test is related with the value of $k$. + +\subsection{Auxiliary functions} + +The package \CRANpkg{CryptRndTest} has five auxiliary functions, namely \code{Strlng2()}, \code{GCD()}, \code{GCD.q()}, \code{GCD.big()}, \code{toBaseTwo()}, \code{toBaseTen()}, and \code{TBT.CriticalValue()}. These functions are also suitable for individual use. \code{Strlng2()} is used to calculate critical values for the topological binary test implemented by \code{TBT.CriticalValue()}. \code{GCD()} and \code{GCD.q()} are called to calculate the greatest common divisor in the GCD test implemented by \code{gcd.test()}. Three possible outcomes of the greatest common divisor operation are the number of iterations, the sequence of partial quotients, and the value of greatest common divisor. \code{GCD()} provides all of these outcomes for any pair of integers excluding zero. Functions \code{toBaseTwo()} and \code{toBaseTen()} are used for base conversion from base 2 to 10 and vice versa for large integers. + +The function \code{Strlng2()} is used to compute natural logarithm of Stirling numbers of the second kind for large values of inputs in an approximate manner by the approaches of \citet{bleick} and \citet{temme}. In this approach, Lambert W functions are employed at the log scale to overcome memory overflows. + +Due to the large factorials in the calculation of Stirling numbers of the second kind, it is nearly impossible to compute exact cdf of the topological binary test statistic for higher bit lengths without memory flows in R. The function \code{TBT.CriticalValue()} implements an approach for the calculation of cdf and approximately computes the required critical value for the topological binary test at a given level of $\alpha$. Because \code{TBT.CriticalValue()} utilizes \code{Strlng2()}, accuracy of results decreases with increasing bit lengths and number of words under consideration. It is also possible to make exact calculations by \code{TBT.CriticalValue()}. In this case, the function \code{Stirling2} from the package \CRANpkg{gmp} is employed instead of \code{Strlng2()}. Because the \CRANpkg{gmp} uses multiple precision arithmetic, implementation time of \code{TBT.CriticalValue()} considerable increases. User should evaluate the trade off between implementation time and high precision. + +Arguments of main and auxiliary functions of \CRANpkg{CryptRndTest} package are summarized in Table \ref{tblUsage}. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Usage of test and auxiliary functions of \CRANpkg{CryptRndTest} package.} + \begin{tabular}{cll} + \hline + \multicolumn{2}{c}{Function} & Call \\ + \hline + Test & GCD.test() & GCD.test(x, KS = TRUE,CSQ = TRUE, AD = TRUE, JB = TRUE, \\ + & & \multicolumn{1}{r}{test.k = TRUE, test.g = TRUE, mu, sd, alpha = 0.05)} \\ + & random.walk.tests() & random.walk.tests(x, B = 64, Excursion = TRUE, \\ + & & \multicolumn{1}{r}{Expansion = TRUE, Height = TRUE, alpha = 0.05)} \\ + & birthday.spacings() & birthday.spacings(x, m = 128, n = $2^{16}$, alpha = 0.05, lambda, \\ + & & \multicolumn{1}{r}{num.class = 10)} \\ + & adaptive.chi.square() & adaptive.chi.square(x, B, S, alpha = 0.05, bit = FALSE) \\ + & book.stack() & book.stack(A, B, k = 2, alpha = 0.05, bit = FALSE) \\ + & topological.binary() & topological.binary(x, B, alpha = 0.05, critical.value) \\ + \hline + Auxiliary & Strlng2() & Strlng2(n, k, log = TRUE) \\ + & GCD() & GCD(x, y) \\ + & GCD.q() & GCD.q(x, y) \\ + & GCD.big() & GCD.big(x, y, B) \\ + & TBT.CriticalValue() & TBT.criticalValue(m, k, alpha = 0.01, cdf = FALSE, exact = TRUE) \\ + & toBaseTen() & toBaseTen(x, m = 128, prec = 256, toFile = FALSE, file) \\ + & toBaseTwo() & toBaseTwo(x, m = 128, prec = 512, num.CPU = 4) \\ + \hline + \end{tabular} + \label{tblUsage} +\end{table} + +\section{A numerical illustration} + +As a numerical illustration of the package, we employed \CRANpkg{CryptRndTest} to test the randomness of RNG's available in R. By this way, we aim to get results of the tests that has not been applied to RNG's of interest yet, figure out implementation performance of \CRANpkg{CryptRndTest} under various scenarios, and illustrate some issues on the determination of parameters of the tests for considered scenarios. Note that it is impossible to observe the ability to control type-I error (rejection of randomness hypothesis while it is actually true) for the tests with an empirical study such as conducted in this section. Additionally, a more thorough investigation would be necessary to be able to reliably assess the algorithms, but this is out of scope of this article. + +RNG's of interest are Wichmann-Hill (WH), Marsaglia-Multicarry (MM), Super-Duper (SD), Mersenne-Twister (MT), Knuth-TAOCP-2002 (KT02), Knuth-TAOCP (KT), and L'Ecuyer-CMRG (LE) (see the function \code{Random} in \CRANpkg{base} package for the details of these RNG's). Applied tests are topological binary (TBT), adaptive chi-square (Achi), birthday spacings (BDS), random walk expansion (RWT.Exp), random walk height (RWT.Hei), random walk excursion (RWT.Exc), book stack (BS), and greatest common divisor (GCD). TBT, RWT.Exp, RWT.Hei, and RWT.Exc tests work with binary numbers while the rest of tests take integers as input. BDS and RWT tests are applied separately with each of Anderson-Darling, Kolmogorov-Smirnov, and chi-square goodness-of-fit tests, and GCD test is applied separately with each of Anderson-Darling, Kolmogorov-Smirnov, Jargue-Bera, and chi-square goodness-of-fit tests. The total number of applied randomness tests is 21. All the tests are applied at both 0.01 and 0.05 levels of significance and 8, 16, 32, 64, and 128-bit lengths. Considered lengths of random number sequences for each bit-length are given in Table \ref{tbl2}. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Lengths of random number sequences for different patterns.} + \begin{tabular}{cccc} + \hline + &\multicolumn{3}{c}{Sequence length}\\ + \cline{2-4} + Bit & Short (I) & Medium (II) & Long (III) \\ + \hline + 8 & 256 & 32768 & 65536 \\ + 16 & 16384 & 65536 & 131072 \\ + 32 & 32768 & 131072 & 262144 \\ + 64 & 131072 & 262144 & 524288 \\ + 128 & 131072 & 262144 & 524288 \\ + \hline + \end{tabular} + \label{tbl2} +\end{table} +Because we get unreasonable implementation times for longer sequences at the level of 128-bit, the same sequence lengths as 64-bit are considered for 128-bit numbers. + +To conduct the adaptive chi-square test, we need to determine the value of argument \code{S} and the proportions of training and testing samples. The latter one is taken equal. As for the value of \code{S}, we did not detect a significant change in the test results observed for medium sequence length for all bit-lengths for $S=2,3,4$ in pilot runs. The values greater than 4 increase the implementation time whereas small values decrease resolution. Thus, it is taken as 4 for all bit-lengths to work with a reasonable degrees of freedom in the chi-square test. Also, adaptive chi-square test is applied for all bit-lengths. + +Arguments of the birthday spacings test are the number of birthdays (\code{m}), the length of year (\code{n}), the mean rate of the theoretical Poisson distribution (\code{lambda}), and the number of classes (\code{num.class}), which is used for goodness-of-fit tests. In the experiments, the argument \code{m} was taken as 8, 128, and 4096 for 8, 16, and 32-bit-lengths, respectively. The argument \code{n} was set to $2^{B}$, where $B$ is the bit-length. The argument \code{lambda} was calculated by the formula given by \citet{marsaglia}. The argument \code{num.class} was set to 5 and 10 for 8 and 16-bit and higher lengths, respectively. + +For the book stack test, length of the sample (\code{n}) should be determined and data should be prepared according to the value of \code{n}. Also, the number of subsets that the alphabet will be divided into (\code{k}) should be determined. The formula proposed by \citet{ryabko2005} is used to calculate the value of \code{n}, and we set \code{k}$=$\code{n}$/B$. + +In the GCD test procedure, tests are conducted for two outputs of GCD operation that number of iterations required to find GCD ($k$) and GCD $(g)$ itself. The population distribution of $k$ is well approximated by a normal distribution and parameters of the normal distribution are given by \citet{marsaglia} for 32-bit integers after an extensive numerical study. We observe that the parameters of population distribution differ for different bit-lengths, and conducted a numerical study to figure out the values of parameters for considered bit-lengths. For this study, $10^{6}$ 30-bit true random numbers were obtained from the web service ``www.random.org." Then, they were converted to 8, 16, 32, 64, and 128-bit numbers. The GCD operation was applied and mean (\code{mu.GCD}) and standard deviation (\code{sd.GCD}) of $k$ were obtained as given in Table \ref{tbl5} after checking the normality of the empirical distribution by means of descriptive statistics and Anderson-Darling goodness of fit test. The values obtained for 32-bit are very close to those obtained by \citet{marsaglia}. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Mean and standard deviation of population distribution of $k$.} + \begin{tabular}{ccc} + \hline + Bit & \code{mu.GCD} & \code{sd.GCD} \\ + \hline + 8 & 3.9991 & 1.6242 \\ + 16 & 8.8784 & 2.3664 \\ + 32 & 18.4023 & 3.4000 \\ + 64 & 31.3269 & 4.3349 \\ + 128 & 31.8390 & 4.3678 \\ + \hline + \end{tabular} + \label{tbl5} +\end{table} + +As expected, mean of $k$ increases along with bit-length, and it approaches to 35 as treated by \citet{marsaglia}. The mild increase in the values of standard deviations is due to the increasing range of the numbers that can be generated with a given bit-length. Also, the GCD test is applied for all bit-lengths. However, nearly for all 128-bit random numbers, $g>35$. Due to the operation done at step 15 of Algorithm 4, it is unreasonable to conduct the GCD test over $g$ for 128-bit numbers. + +Topological binary test is also applied for all bit-lengths. Critical values for topological binary test are calculated by using the function \code{TBT.criticalValue()} for each bit and sequence length combination and presented in Table \ref{tbl3}. Because the length of sequence being tested cannot be longer than $2^{m}-1$, where $m$ is the bit-length, critical values for medium and long sequences at 8-bit and for long sequences at 16-bit levels are not available in Table \ref{tbl3}. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Critical values for toplogical binary test.} + \begin{tabular}{ccccccc} + \hline + & \multicolumn{3}{c}{$\alpha=0.01$}& \multicolumn{3}{c}{$\alpha=0.05$} \\ + \hline + Bit & Short & Medium & Long & Short & Medium & Long \\ + \hline + 8 & 153 & NA & NA & 153 & NA & NA \\ + 16 & 14423 & 41268 & NA & 14423 & 41266 & NA \\ + 32 & 32767 & 131066 & 262129 & 32767 & 131066 & 262129 \\ + 64 & 131070 & 262113 & 523264 & 131070 & 262113 & 524264 \\ + 128 & 131072 & 262144 & 524288 & 131072 & 262144 & 524288 \\ + \hline + \multicolumn{6}{l}{\scriptsize NA: not available.}\\ + \end{tabular} + \label{tbl3} +\end{table} + +In the application, random numbers were generated by the Function 1 given in R codes of this vignette. Experiments were carried out by the Function 2 of related R codes. In both functions, \code{RNG} is the number indicating employed pseudo random number generator, \code{m} is the bit-length, and \code{len} is the length of the random number sequence. In the function \code{experiments()}, \code{cv.TBT} is the critical value of topological binary test, and \code{mu.GCD} and \code{sd.GCD} are mean and standard deviation of true distribution of $k$, respectively. + +Random number sequences used for the performance analysis are of medium length given in Table \ref{tbl2} and generated by WH generator under each bit level. Five replications were made for each test. Mean implementation times calculated over five replications are shown in Table \ref{tbl4} in seconds. All variances of implementation times are less than 0.01. BDS, RWT, and BS tests were not applied at all bit-lengths due to reasons explained in relevant sections. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Mean implementation time for each test in seconds.} + \begin{tabular}{cccccccccc} + \hline + & & \multicolumn{8}{c}{Tests}\\ + \cline{3-10} + Bit & Length & TBT & Achi & BDS & RWT.Exp & RWT.Hei & RWT.Exc & BS & GCD \\ + \hline + 8 & 32768 & 0.62 & 2.88 & 0.46 & NA & NA & NA & $<0.01$ & 1.31 \\ + 16 & 65536 & 1.70 & 5.70 & 0.46 & NA & NA & 4.33 & 0.02 & 3.74 \\ + 32 & 131072 & 6.68 & 10.88 & 2.10 & NA & 0.26 & 15.99 & 4253.01 & 12.32\\ + 64 & 262144 & 32.05 & 86.31 & NA & 84.21 & 88.74 & 64.68 & NA & 37.36 \\ + 128 & 262144 & 77.16 & 10121.34 & NA & 221.16 & 196.96 & 149.29 & NA & 2657.62 \\ + \hline + \multicolumn{10}{l}{\scriptsize TBT: topological binary, Achi: adaptive chi-square, BDS: birthday spacings, RWT: random walk, Exp: expansion,}\\ + \multicolumn{10}{l}{\scriptsize Hei: height, BS: book stack, GCD: greatest common divisor, Length: the length of random number sequence,}\\ + \multicolumn{10}{l}{\scriptsize NA: not available.}\\ + \end{tabular} + \label{tbl4} +\end{table} + +Implementation times of all tests from 8 to 64-bit levels are all sufficient. For 128 bits, most of the implementation times of Achi and GCD tests are taken by finding unique values in a sequence composed of multiple precision floating-point (mpf) numbers at step 4 of Algorithm 1 and the value of gcd for mpf numbers at step 3 of Algorithm 4, respectively. For these operations, mpf numbers are used via the package \CRANpkg{Rmpfr}. The package \CRANpkg{Rmpfr} is based on GMP GNU library and provides an interface from R to the C \citep{maechler11a,maechler11b}. Due to the use of mpf numbers via the package \CRANpkg{Rmpfr}, there is a considerable increase in implementation time of Achi and GCD tests at 128-bit level. However, the gain in precision is worth the delay in implementation of these tests. Performances of the tests working with binary numbers are all sufficient at 128-bit level. Implementation time of the BS test exponentially increases along with the bit-length. Although it is reasonable for 32 bits, application of the test for higher bit-lengths requires unreasonable amount of time for implementation. + +All the tests were applied at both $0.01$ and $0.05$ levels of significance. The null hypothesis is ``$H_{0}:$ Sequences generated by the RNG of interest are random" for all tests. At $0.05$ level of significance, test results for all generators of interest are given in Table \ref{tbl6}-\ref{tbl12}. Due to the similarity between results at both levels of significance, those for $0.01$ level are omitted. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for WH generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + + BDS.AD & 1 & 0 & 0 & 1 & 0 & 0 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 0 & 0 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 \\ + AD.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 0 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl6} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for SD generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 0 & 0 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 \\ + AD.k & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl7} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for MT generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 0 & 1 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 0 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 1 & 0 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + AD.k & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl8} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for MM generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 0 & 1 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 0 \\ + AD.k & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl9} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for LE generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 \\ + AD.k & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl10} +\end{table} + + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for KT02 generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 0 & 0 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 0 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 \\ + AD.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl11} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for KT generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 \\ + CS.k & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 \\ + AD.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 \\ + JB.k & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl12} +\end{table} + +For both levels of significance, success rates of RNGs over the total number of applied tests are given in Table \ref{tbl13}. The total number of applied tests is given in the last row of Table \ref{tbl6} for each test scenario. For example, because the birthday spacings test is not applied for 64 bit-length, the total number of applied tests is 17 for all sequence lengths. Note that the values given in Table \ref{tbl13} should not be confused with issues related with statistical performance of the tests such as type I error or power. Table \ref{tbl13} represents the proportion of RNG's that did not fail in the given number of tests. In addition, because each test is applied individually, the information presented by Table \ref{tbl13} should not be perceived as the results of application of a test battery. + +\begin{table}[htbp] + \centering + \caption{Success rates for RNG over the tests applied by CryptRndTest.} + \resizebox{\textwidth}{!}{\begin{tabular}{ccccccccccccccccc} + \hline + & & \multicolumn{15}{c}{Bit-length} \\ + \cline{3-17} + Level & & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{3-17} + of & & \multicolumn{15}{c}{Sequence length} \\ + \cline{3-17} + Significance & RNG & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + 0.01 & WH & 0.92 & 0.58 & 0.50 & 0.93 & 1.00 & 0.86 & 0.86 & 0.93 & 0.93 & 0.47 & 0.47 & 0.47 & 0.33 & 0.27 & 0.33 \\ + & SD & 0.92 & 0.58 & 0.75 & 0.93 & 0.93 & 0.93 & 0.93 & 0.93 & 0.93 & 0.41 & 0.47 & 0.35 & 0.33 & 0.33 & 0.27 \\ + & MT & 0.92 & 0.58 & 0.58 & 1.00 & 1.00 & 0.93 & 0.93 & 0.93 & 0.93 & 0.47 & 0.41 & 0.47 & 0.33 & 0.33 & 0.33 \\ + & MM & 0.92 & 0.58 & 0.75 & 0.93 & 0.93 & 1.00 & 1.00 & 0.93 & 0.93 & 0.47 & 0.41 & 0.35 & 0.33 & 0.33 & 0.27 \\ + & LE & 0.92 & 0.67 & 0.58 & 0.93 & 0.93 & 0.79 & 1.00 & 0.93 & 0.93 & 0.47 & 0.47 & 0.47 & 0.33 & 0.27 & 0.33 \\ + & KT & 0.92 & 0.67 & 0.58 & 0.93 & 0.93 & 0.93 & 1.00 & 0.93 & 0.93 & 0.41 & 0.47 & 0.47 & 0.27 & 0.33 & 0.33 \\ + & KT02 & 0.92 & 0.67 & 0.58 & 1.00 & 0.93 & 1.00 & 1.00 & 0.93 & 0.86 & 0.47 & 0.41 & 0.47 & 0.27 & 0.33 & 0.33 \\ + \hline + 0.05 & WH & 0.83 & 0.50 & 0.50 & 0.93 & 0.93 & 0.86 & 0.79 & 0.93 & 0.93 & 0.47 & 0.47 & 0.47 & 0.33 & 0.27 & 0.33 \\ + & SD & 0.92 & 0.58 & 0.75 & 0.93 & 0.93 & 0.86 & 0.86 & 0.79 & 0.86 & 0.41 & 0.47 & 0.29 & 0.33 & 0.33 & 0.27 \\ + & MT & 0.67 & 0.50 & 0.58 & 0.93 & 0.86 & 0.86 & 0.93 & 0.86 & 0.93 & 0.41 & 0.41 & 0.47 & 0.33 & 0.33 & 0.33 \\ + & MM & 0.92 & 0.58 & 0.75 & 0.93 & 0.93 & 0.93 & 1.00 & 0.86 & 0.93 & 0.47 & 0.41 & 0.35 & 0.33 & 0.33 & 0.27 \\ + & LE & 0.92 & 0.67 & 0.58 & 0.93 & 0.93 & 0.79 & 0.93 & 0.86 & 0.93 & 0.47 & 0.41 & 0.47 & 0.33 & 0.27 & 0.33 \\ + & KT & 0.92 & 0.58 & 0.58 & 0.93 & 0.86 & 0.93 & 1.00 & 0.93 & 0.93 & 0.41 & 0.41 & 0.47 & 0.27 & 0.20 & 0.33 \\ + & KT02 & 0.83 & 0.58 & 0.42 & 1.00 & 0.93 & 0.93 & 1.00 & 0.93 & 0.79 & 0.47 & 0.41 & 0.47 & 0.27 & 0.33 & 0.33 \\ + \hline + \multicolumn{2}{r}{Number of tests} & 12 & 12 & 12 & 15 & 15 & 15 & 15 & 15 & 15 & 17 & 17 & 17 & 15 & 15 & 15 \\ + \hline + \end{tabular}} + \label{tbl13} +\end{table} + +In general, proportion of success decreases with increasing sequence and bit-lengths. According to proportions of success, performance of WH generator is satisfactory for 16 and 32-bit numbers for all sequence lengths. The reason of getting a decreasing success rate with increasing bit-length is that the random walk tests with all goodness-of-fit tests and GCD test with Jarque-Bera goodness-of-fit test reject the randomness hypothesis while the rest of the tests mostly accept the hypothesis for bit-lengths greater than 32. In detail, WH generator successfully passed both of the TBT and Achi tests nearly in all bit-sequence length combinations. Results of AD and KS goodness-of-fit tests applied under both BDS and GCD tests (with $k$) are similar, and CS test more likely decides randomness of WH generator. It is unsuccessful in passing the random walk tests for high bit-lengths. BS test concludes WH's randomness under all of the test conditions. GCD with JB goodness-of-fit test rejects the null hypothesis of randomness under all test conditions but the first one. At $0.01$ level of significance, there is nearly no change in the results. WH generator passes the GCD test with CS goodness-of-fit test for $k$ at (8, I), (8, II) and (32, I) scenarios, and the BDS test with AD goodness-of-fit test at (16, II). + +According to proportions of success, SD generator is mostly passed the tests for 16 and 32-bit integers for all sequence lengths, and 8-bit integers for short and long sequences. Detailed test results for SD generator at $0.05$ level of significance are similar to that of WH generator for TBT, Achi, BDS, RWT, and BS tests. It is better in GCD test with JB goodness-of-fit test for $k$. At $0.01$ level of significance, CS goodness-of-fit test applied with GCD test cannot reject the null hypothesis for 4 scenarios. + +Reaction of the tests for MT, MM, and LE generators is similar to that of WH generator. According to proportions of success, success rates of MT generator is satisfactory for 16 and 32-bit numbers for all sequence lengths; and that of MM generator is very satisfactory for 16 and 32-bit numbers for all sequence lengths, and 8-bit numbers for short and long sequence lengths. Success proportions of LE, KT, and KT02 generators are high for 16 and 32-bit numbers for all sequence lengths, and 8-bit numbers for short sequences. BS test rejects randomness of KT02 generator for 8-bit numbers for all sequence lengths at $0.05$ level of significance. However, it cannot reject the null hypothesis for 8-bit numbers for all sequence lengths for $\alpha=0.01$. + +For 64-bit numbers, only random walk excursion test with AD and KS goodness-of-fit tests cannot reject the null hypothesis for all RNG's. None of the random walk tests decided randomness of RNG's for 128-bit numbers. RNG's passed TBT, Achi, and GCD for $k$ with AD, KS, and CS goodness-of-fit tests for almost all sequence lengths. This situation decreases the proportion of success for 64 and 128-bit numbers. This result would be due to the conservativeness of random walk height, random walk expansion tests, and GCD test with Jarque-Bera goodness-of-fit test for higher bit lengths. + +\section{Summary} + +Statistical analysis of randomness of a cryptographic random number generator is a critical and necessary task to make use of the generator in cryptographic applications. Many cryptographic randomness tests are available for this task including recently proposed ones. Although there are several alternatives, chi-square test is frequently employed within these cryptographic randomness tests as a goodness-of-fit test. In this regard, this article describes the package \CRANpkg{CryptRndTest} that conducts frequently used and newly proposed 8 cryptographic randomness tests along with Anderson-Darling, Kolmogorov-Smirnov, chi-square, and Jarque-Bera goodness-of-fit tests. Totally, \CRANpkg{CryptRndTest} runs 21 tests. It also provides auxiliary functions for the calculation of greatest common divisor, sequence of partial quotients resulting from the greatest common divisor operation, the base conversion from 2 to 10 and vice versa, and the Stirling numbers of the second kind. All of these auxiliary functions also work with long integers by the use of multi-precision floating point numbers. + +In addition to the description of \CRANpkg{CryptRndTest}, random number generators available in R are tested by 21 cryptographic randomness tests of \CRANpkg{CryptRndTest} under various combinations of sequence and bit-lengths. Implementation performance of \CRANpkg{CryptRndTest} is also revealed by the numerical application. + +The limitations of the package is mostly related to the memory and CPU capacities of the computer used to run functions of \CRANpkg{CryptRndTest}. Because, increasing bit-length considerably decreases the implementation speed of tests working over integers, this can also be seen as a limitation for high bit-lengths. + +\section{Acknowledgements} +This work is fully supported by The Scientific and Technological Research Council of Turkey (TUBITAK) under Grant No. 114F249 of ARDEB-3001 programme. + +%\bibliographystyle{agsm} +\bibliography{demirhan_Crypt_2015} +\end{article} +\end{document} diff --git a/inst/doc/CryptRndTest.pdf b/inst/doc/CryptRndTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e2a1941efa68e06202be84a41e65e5e25f8adbb1 GIT binary patch literal 179059 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

73aZ~2(jjF-IPqSn@+g* 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 -} -\note{\bold{Acknowledgement:} The package \pkg{CryptRndTest} is based upon work supported by The Scientific and Technological Research Council of Turkey (TUBITAK) under Grant No. 114F249 of ARDEB-3001 grant. -} -\references{ - -Alcover, P.M., Guillamon, A., Ruiz, M.C., A new randomness test for bit sequences. Informatica (2013), 24(3), 339--356. - -Bleick, W.W., Wang, P.C.C., Asymptotics of Stirling Numbers of the Second Kind. Proceedings of the American Mathematical Society (1974), 42(2), 575--580. - -Doganaksoy, A., Calik, C., Sulak, F., Turan, M.S., New randomness tests using random walk, In: National Cryptology Symposium II, (2006), Ankara, Turkey. - -Marsaglia, G., Tsang, W.W., Some Difficult-to-pass tests of randomness. Journal of Statistical Software (2002), 7(3). - -Ryabko, B.Ya., Monarev, V.A., Using information theory approach to randomness testing. Journal of Statistical Planning and Inference (2005), 133, 95--110. - -Ryabko, B.Ya., Stognienko, V.S., Shokin Yu.I., A new test for randomness and its application to some cryptographic problems. Journal of Statistical Planning and Inference (2004), 123, 365--376. - -Temme, N.M., Asymptotic estimates of Stirling numbers. Studies in Applied Mathematics (1993), 89, 233--243. -} - -\keyword{ Anderson-Darling, chi-Square, goodness-of-fit test, greatest common divisor, Stirling numbers of the second kind, Jarque-Bera, Kolmogorov-Smirnov, nonparametric, randomness test} - -\seealso{ -\code{\link[CryptRndTest]{adaptive.chi.square}}, \code{\link[CryptRndTest]{birthday.spacings}}, \code{\link[CryptRndTest]{book.stack}}, \code{\link[CryptRndTest]{GCD.test}}, \code{\link[CryptRndTest]{GCD}}, \code{\link[CryptRndTest]{GCD.q}}, \code{\link[CryptRndTest]{GCD.big}}, \code{\link[CryptRndTest]{random.walk.tests}}, \code{\link[CryptRndTest]{topological.binary}}, \code{\link[CryptRndTest]{Strlng2}}, \code{\link[copula]{Stirling2}} -} -\examples{ -# ----- General settings --- -RNGkind(kind = "Super-Duper") -B=8 # Bit length is 8. -k=2000 # Generate 20000 integers. -alpha=0.05 - -# ----- Adaptive chi-square ----- -A=0 -A=round(runif(k,0,(2^B-1))) -S=2 # Divide alphabet to two sub-sets. -test1=adaptive.chi.square(x=A, B, S, alpha, bit = FALSE) -print(test1) - -# ----- Birthday Spacings ----- -m=16 # Number of birthdays is 16. -n=2^B # Length of year is 256. -lambda=(m^3)/(4*n) -x=round(runif(k,0,(2^B-1))) -test2=birthday.spacings(x, m, n, alpha, lambda, num.class=10) -print(test2) - -# ----- Book Stack ----- -n=B*(2^(B/2)) # Number of required bits. -N=n/B # Number of integers to be generated. -A=0 -A=round(runif(N,0,(2^B-1))) -K=2 # Divide alphabet to two sub-sets. -test3=book.stack(x=A, B, k = K, alpha, bit = FALSE) -print(test3) - -# ----- Toplogical Binary Test ----- - -dat=round(runif(k,0,(2^B-1))) -x=sfsmisc::digitsBase(dat, base= 2, B) #Convert to base 2 -critical.value=150 #Obtained for B=8 -test4=topological.binary(x, B, alpha, critical.value) -print(test4) - -# ----- Other Functions ----- -# ----- GCD ----- -result=GCD(45,2) -print(result) - -result=GCD(321235,25521) -print(result) - -# ----- Striling 2 ----- -Strlng2(1500,410,log=TRUE) # Large values of n and k +\name{CryptRndTest-package} +\alias{CryptRndTest-package} +\alias{CryptRndTest} +\docType{package} +\title{ +Statistical Tests for Cryptographic Randomness +} +\description{ +Performs cryptographic randomness tests on a sequence of random integers or bits. Included tests are greatest common divisor, birthday spacings, book stack, adaptive chi-square, topological binary, and three random walk tests. Tests except greatest common divisor and birthday spacings are not covered by standard test suites. In addition to the chi-square goodness-of-fit test, results of Anderson-Darling, Kolmogorov-Smirnov, and Jarque-Bera tests are also generated by some of the cryptographic randomness tests. Additionally, it includes functions for the calculation of greatest common divisor, the Stirling numbers of the second kind, critical value of the topological binary test, and base conversions from base 2 to 10 and vice versa. +} +\details{ +\tabular{ll}{ +Package: \tab CryptRndTest\cr +Type: \tab Package\cr +Version: \tab 1.2.1\cr +Date: \tab 2015-12-24\cr +License: \tab GPL-3\cr +} +To test statistical randomness of cryptographic randomness use functions \code{birthday.spacings} and \code{GCD.test} for testing sequences of integers, functions \code{adaptive.chi.square} and \code{book.stack} for testing sequences of integers or bits, and use functions \code{random.walk.tests} and \code{topological.binary} for testing sequences of bits. The function \code{random.walk.tests} performs random walk-excursion, random walk-expansion, and random walk-height tests. + +Additionally, use the function \code{GCD.q} to compute greatest common divisor (GCD), the number of iterations required to find GCD, and the sequence of partial quotients for two integers. Use the function \code{GCD} to compute GCD and the number iterations required to find GCD, recursively. Use the function \code{GCD.big} to compute GCD, the number iterations required to find GCD, and the sequence of partial quotients for two big integers. Use the function \code{Strlng2} to compute the Stirling numbers of the second kind in an approximate manner when the inputs are large. Use the function \code{TBT.criticalValue} to compute the critical value for the topological binary test at a given level of significance. Use the function \code{toBaseTwo} to convert integers (including big integers) from base 10 to 2. Use the function \code{toBaseTen} to convert binary sequences (including long binary sequences) from base 2 to 10. +} +\author{ +Haydar Demirhan + +Maintainer: Haydar Demirhan +} +\note{\bold{Acknowledgement:} The package \pkg{CryptRndTest} is based upon work supported by The Scientific and Technological Research Council of Turkey (TUBITAK) under Grant No. 114F249 of ARDEB-3001 grant. +} +\references{ + +Alcover, P.M., Guillamon, A., Ruiz, M.C., A new randomness test for bit sequences. Informatica (2013), 24(3), 339--356. + +Bleick, W.W., Wang, P.C.C., Asymptotics of Stirling Numbers of the Second Kind. Proceedings of the American Mathematical Society (1974), 42(2), 575--580. + +Doganaksoy, A., Calik, C., Sulak, F., Turan, M.S., New randomness tests using random walk, In: National Cryptology Symposium II, (2006), Ankara, Turkey. + +Marsaglia, G., Tsang, W.W., Some Difficult-to-pass tests of randomness. Journal of Statistical Software (2002), 7(3). + +Ryabko, B.Ya., Monarev, V.A., Using information theory approach to randomness testing. Journal of Statistical Planning and Inference (2005), 133, 95--110. + +Ryabko, B.Ya., Stognienko, V.S., Shokin Yu.I., A new test for randomness and its application to some cryptographic problems. Journal of Statistical Planning and Inference (2004), 123, 365--376. + +Temme, N.M., Asymptotic estimates of Stirling numbers. Studies in Applied Mathematics (1993), 89, 233--243. +} + +\keyword{ Anderson-Darling, chi-Square, goodness-of-fit test, greatest common divisor, Stirling numbers of the second kind, Jarque-Bera, Kolmogorov-Smirnov, nonparametric, randomness test} + +\seealso{ +\code{\link[CryptRndTest]{adaptive.chi.square}}, \code{\link[CryptRndTest]{birthday.spacings}}, \code{\link[CryptRndTest]{book.stack}}, \code{\link[CryptRndTest]{GCD.test}}, \code{\link[CryptRndTest]{GCD}}, \code{\link[CryptRndTest]{GCD.q}}, \code{\link[CryptRndTest]{GCD.big}}, \code{\link[CryptRndTest]{random.walk.tests}}, \code{\link[CryptRndTest]{topological.binary}}, \code{\link[CryptRndTest]{Strlng2}}, \code{\link[copula]{Stirling2}} +} +\examples{ +# ----- General settings --- +RNGkind(kind = "Super-Duper") +B=8 # Bit length is 8. +k=2000 # Generate 20000 integers. +alpha=0.05 + +# ----- Adaptive chi-square ----- +A=0 +A=round(runif(k,0,(2^B-1))) +S=2 # Divide alphabet to two sub-sets. +test1=adaptive.chi.square(x=A, B, S, alpha, bit = FALSE) +print(test1) + +# ----- Birthday Spacings ----- +m=16 # Number of birthdays is 16. +n=2^B # Length of year is 256. +lambda=(m^3)/(4*n) +x=round(runif(k,0,(2^B-1))) +test2=birthday.spacings(x, m, n, alpha, lambda, num.class=10) +print(test2) + +# ----- Book Stack ----- +n=B*(2^(B/2)) # Number of required bits. +N=n/B # Number of integers to be generated. +A=0 +A=round(runif(N,0,(2^B-1))) +K=2 # Divide alphabet to two sub-sets. +test3=book.stack(x=A, B, k = K, alpha, bit = FALSE) +print(test3) + +# ----- Toplogical Binary Test ----- + +dat=round(runif(k,0,(2^B-1))) +x=sfsmisc::digitsBase(dat, base= 2, B) #Convert to base 2 +critical.value=150 #Obtained for B=8 +test4=topological.binary(x, B, alpha, critical.value) +print(test4) + +# ----- Other Functions ----- +# ----- GCD ----- +result=GCD(45,2) +print(result) + +result=GCD(321235,25521) +print(result) + +# ----- Striling 2 ----- +Strlng2(1500,410,log=TRUE) # Large values of n and k } \ No newline at end of file diff --git a/vignettes/CryptRndTest.ltx b/vignettes/CryptRndTest.ltx new file mode 100644 index 0000000..c95a2f4 --- /dev/null +++ b/vignettes/CryptRndTest.ltx @@ -0,0 +1,737 @@ +\documentclass[a4paper]{report} +%\VignetteIndexEntry{Details of CryptRndTest Package} +%\VignetteEngine{R.rsp::tex} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{RJournal} +\usepackage{amsmath,amssymb,array} +\usepackage{booktabs} + +\begin{document} +\sectionhead{Vignette for CryptRndTest} +\volume{} +\volnumber{} +\year{} +\month{} +\begin{article} + +\title{CryptRndTest: An R package for testing the cryptographic randomness} +\author{Haydar Demirhan\footnote{Corresponding author. e-mail:haydar.demirhan@rmit.edu.au}\\ + Hacettepe University, Department of Statistics\\ + 06800 Beytepe Ankara Turkey\\ + and\\ + RMIT University, School of Science\\ + Mathematical and Geospatial Sciences\\ 3001 Melbourne Australia\\ + \\ + Nihan Bitirim\\ + Council of Higher Education\\ + 06800 Cankaya Ankara\\ + Turkey} + +\maketitle + +\abstract{In this article, we introduce the R package CryptRndTest that performs eight statistical randomness tests on cryptographic random number sequences. The purpose of the package is to provide a software for the implementation of recently proposed cryptographic randomness tests utilizing goodness-of-fit tests superior to the usual chi-square test in terms of statistical performance. Most of the tests included by CryptRndTest are not conducted by available software such as the R package RDieHarder or the C library TestU01. Chi-square, Anderson-Darling, Kolmogorov-Smirnov, and Jarque-Bera goodness-of-fit procedures are applied along with cryptographic randomness tests. CryptRndTest utilizes multiple precision floating numbers for sequences longer than 64-bit by the use of package Rmpfr. By this way, included tests are applied precisely for higher bit-lengths. CryptRndTest provides a user friendly interface for eight existing and recently proposed cryptographic randomness tests. As an illustrative application, CryptRndTest is used to test available random number generators in R.} + + +%\symbolfootnote[0]{This work is fully supported by The Scientific and Technological Research Council of Turkey (TUBITAK) under Grant No. 114F249 of %ARDEB-3001 programme.} + + +\section{Introduction} + +Cyptographic random numbers constitute the heart of ciphering processes. Security of the transmitted information is mostly based on the quality of random numbers used to cipher the information. Due to the efficiency considerations, pseudo random numbers that ensure some hard-to-achieve properties are used for ciphering in practice. There are a considerable amount of pseudo random number generators (RNG's) in the literature of cryptography. Suitability of these RNG's for use in cryptographic applications is evaluated by using statistical randomness tests that are specifically designed to test randomness at the level required for ciphering processes. + +In a cryptographic randomness test, first, empirical distribution of a test statistic is obtained over a random number sequence by various data manipulations. Then, a statistical goodness-of-fit test is applied to evaluate significance of the difference between the empirical distribution and its theoretical counterpart at a predetermined level of significance. The need for a certain level of randomness to ensure unpredictability in cryptography context makes procedures used to check cryptographic and classical randomness different from each other. The manipulations of random number sequences are required to make the cryptographic randomness tests more sensitive to small deviations from the exact randomness than their classical counterparts. The null hypothesis of the test is "$H_{0}:$ Sequences generated by the RNG of interest are random." There are more than a hundred alternative tests for the evaluation of cryptographic randomness \citep{lecuyer1998}. + +In the literature, some of these tests are grouped into test batteries or test suites \citep{lecuyer2007,marsaglia}. A detailed review of test batteries is given by \citet{demirhan15}. To be qualified as suitable, an RNG should be identified as random in a predetermined portion or all of the tests in a test battery. The basic test battery is introduced by \citet{Knuth1998,Knuth1981,Knuth1969}. Then, \citet{diehard} introduced the Diehard test battery composed of 12 randomness tests. Disadvantages of Diehard test battery were overcame by another test battery called Dieharder that is introduced by \citet{bronw14}. Dieharder includes 26 cryptographic randomness tests. It is an improvement of Diehard battery, provides a user friendly interface and a useful open source toolset for users of random numbers \citep{bronw14}. The Dieharder test battery is implemented by the R package \CRANpkg{RDieHarder} prepared by \citet{eddelbuettel_bronw}. At the time of writing, Windows and OS X binaries are not available for this package. US National Institute of Standards and Technology developed the NIST battery composed of 16 tests \citep{sys14,sys14_2,rukhinetal10,rukhin,soto99}. The NIST battery is still used as a straightforward tool for formal certifications and accepted as a standard test battery. \citet{sadique} reviewed the tests included in NIST test battery. A suite of test batteries, TestU01, was introduced by \citet{lecuyer2007,testu01}. TestU01 is a C library that combines most of the available randomness tests and RNGs in six test batteries \citep{mccullough,lecuyer2007}. There are also smaller scale test batteries in terms of extensiveness. ENT was proposed by \citet{ent} that contains 5 statistics and tests. The Helsinki test battery is based on Ising model and random walks on lattices and was proposed by \citet{vattulainen}. The Crypt-X test battery, which includes 6 tests, was developed by Information Security Research Center at Queensland University of Technology \citep{sys14_2,soto99}. SPRNG test battery includes some tests from the battery of Knuth \citep{mascagni}. \citet{rutti} combined Knuth, Helsinki, Diehard, and SPRNG batteries and proposed a test battery consisting of 37 statistical and physical tests. + +In addition to the tests included by test batteries, there are recently proposed cryptographic randomness tests that are not performed by test batteries. \citet{maurer} proposed a statistical test for random bit generators. \citet{hernandez} proposed a new test called Strict Avalanche Criterion (SAC). \citet{ryabko2004} proposed an adaptation of well-known chi-square test. This test is more efficient than the usual chi-square test in small samples. ``Book Stack" and ``Order" tests were proposed by \citet{ryabko2005} for testing binary random bit sequences. \citet{doganaksoy06} proposed three randomness tests based on random walk process. Advantage of these tests is that it is possible to calculate exact probabilities corresponding to the test statistics. ``Topological Binary Test" was introduced by \cite{alcover} to test randomness in bit sequences. It counts different bit patterns of pre-determined length in a sequence of random bits. + +Availability of a software for the implementation of a test battery or even that of an individual cryptographic randomness test is a critical issue on the usefulness of related test or battery. The library TestU01 is developed on ANSI C; hence, it is compiled by GNU tools instead of today's C compilers. Although TestU01 performs a wide variety of tests and their combinations, it lacks flexibility of implementation. Because the battery Dieharder is implemented by an R package, namely \CRANpkg{RDieHarder}, it is more applicable and user-friendly than TestU01. However, unavailability of Windows and OS X binaries can be seen as a disadvantage that decreases its accessibility. A package for the implementation of the NIST battery is prepared on SUN workstation using ANSI C \citep{rukhinetal10}. \citet{rukhinetal10} provides a user guide for setting up the package and running the included tests. Ease of implementation of NIST battery is similar with TestU01. For the implementation of individual randomness tests, there are also numerous R packages such as \CRANpkg{randtests} or \CRANpkg{DescTools}. Although some of the tests included by these packages are also used to evaluate cryptographic randomness, they cover neither recently proposed tests nor those developed specifically to test cryptographic randomness. + +The usual chi-square test is applied with nearly all of the cryptographic randomness tests in the literature. The mentioned implementations including those covered by R automatically apply chi-square test. However, there are numerous alternatives to chi-square goodness-of-fit test such as Kolmogorov-Smirnov, Anderson-Darling, or Jarque-Bera. It is apparent that because statistical qualities of these tests are better than the chi-square test, there will be a gain in performance of cryptographic randomness tests applied with better goodness-of-fit tests. Thus, we need a software that is capable of conducting actual cryptographic randomness tests such as topological binary, book stack, etc. with goodness-of-fit tests better than usual chi-square in statistical performance. When the range and variety of cryptographic randomness tests implemented by software and practicability of available software are considered, the new software should effectively implement new tests with various goodness-of-fit tests and has a user-friendly interface. The package \CRANpkg{CryptRndTest} contributes to satisfy this need. + +The aim of this article is to describe and illustrate use of the R package \CRANpkg{CryptRndTest} (currently in version 1.2.2) that performs some of recently proposed and basic cryptographic randomness tests. The article is mainly based on the paper of \citet{demirhan16}. The package includes the functions \code{adaptive.chi.square}, \code{birthday.spacings}, \code{book.stack}, \code{GCD.test}, \code{topological.binary}, and \code{random.walk.tests} to perform adaptive chi-square, birthday spacing's, book stack, greatest common divisor, topological binary tests, and three tests based on the random walk process, respectively. To the best of our knowledge, the adaptive chi-square, topological binary, and the tests based on the random walk process are first implemented by a software with \CRANpkg{CryptRndTest}. In addition to the chi-square procedure, these functions apply Anderson-Darling, Kolmogorov-Smirnov, and Jarque-Bera procedures when suitable. Because statistical performances of goodness-of-fit tests differ under various conditions, application of different goodness-of-fit procedures is a beneficial feature. This is another important utility of \CRANpkg{CryptRndTest}. In addition, it has the following auxiliary functions: \code{GCD}, \code{GCD.q}, \code{GCD.big}, \code{Strlng2}, \code{toBaseTwo}, \code{toBaseTen}, and \code{TBT.criticalValue} to compute greatest common divisor under different conditions of inputs, approximately calculate the Stirling number of the second kind when the inputs are large, make base conversions precisely with large inputs, and calculate critical values for topological binary test. + +The paper is organized as follows: in the next section, methodologies of the tests included in \CRANpkg{CryptRndTest} are briefly given. Details of algorithms used to manipulate integer and bit sequences are mentioned, and applications of goodness-of-fit procedures performed by \CRANpkg{CryptRndTest} are clarified. Parameter settings and limitations for each test are mentioned. Finally, as an illustrative application of \CRANpkg{CryptRndTest}, random number generators available in R are tested by using the proposed package under different sequence and bit-length conditions. By this application, implementation performance of the package is analyzed, recently proposed tests are evaluated, and usage of \CRANpkg{CryptRndTest} is illustrated. + +\section{Performed tests} + +\subsection{Adaptive chi-square} + +Adaptive chi-square test was introduced by \citet{ryabko2004}. It is empirically demonstrated by \citet{ryabko2004} that the adaptive chi-square test is more efficient than the classical chi-square test in the identification of non-random patterns in samples smaller than those required by the chi-square test. For example, when we work with 64-bit numbers the length of the alphabet is $2^{64}$; hence, we need to have a sequence of length greater than $5\cdot 2^{64}$ to apply the classical chi-square test safely. The logic behind the test is to divide the alphabet into subsets and perform chi-square test over subsets instead of individual elements of the sample. By this way, subsets are considered as a new alphabet and a new null hypothesis and its alternative are formed over the subsets. Because the number of categories required to test new hypotheses is equal to the number of subsets, the chi-square test is applied with much smaller samples. To conclude randomness, it is expected to observe a uniformity in the distribution of input numbers into the subsets. Deviations from this uniformity are detected by the adaptive chi-square test. + +The function \code{adaptive.chi.square()} is called to apply the test. It implements the following pseudo-code algorithm: \\ + +\noindent{\bf Algorithm 1.} +\begin{enumerate} + \item Input data as a matrix of bits or a vector of integers, the number of subsets $(S)$ that the alphabet will be divided into, and proportion of training data set; + \item If data is represented by bits, transform data to base-10; + \item Divide whole data set into training and testing subsets with regarding input weights; + \item Identify the numbers that are seen in the sequence of interest at least once; + \item Find the frequency of occurrences for each element of alphabet in training and testing subsets; + \item For $i=1,\dots,S$, find the frequency of elements that are seen $i$-times in the training and testing subsets; + \item Apply the two-sample chi-square test with the expected and observed counts obtained at the previous step over the training and testing subsets, respectively; + \item Return value of the test statistic, corresponding p-value, and the decision on the null hypothesis. +\end{enumerate} + +While working with integers, the alphabet corresponds to the range of considered numbers. For instance, if 32-bit numbers are being tested, the alphabet in Algorithm 1 includes the numbers between 0 and $2^{32}-1$. At step 4, we do not form whole alphabet, instead we count the numbers (words) that are seen at least once; and hence, the rest of the numbers have zero count. At step 7, the degrees of freedom of the test is $S-1$. + +Parameters of the adaptive chi-square test are: weight of training and testing samples ($r$), the length of the considered number sequence ($n$), and the number of subsets ($S$) that the alphabet is divided into. \citet{ryabko2004} do not give strict rules for the determination of values of these parameters. They suggest to run some experiments to find the values of parameters that provide the highest statistical performance such as power and specificity. Because such a study would not be cost-effective for an individual application of the test, at least, the user may evaluate sensitivity of test results to the values of $S$ and $r$. In the function \code{adaptive.chi.square()}, we set $r=0.5$ by default. The value of $S$ is set by user. That of $n$ is determined by the length of input data. Because input data is a random sample from the RNG of interest, the value of $n$ should be increased with increasing bit-length to successfully represent the range of numbers that will be generated by the RNG. When bit-length is greater than 64, we utilize the package \CRANpkg{Rmpfr} to work with higher precision. + +Algorithm complexity of the function \code{adaptive.chi.square()} is $O(n^{2})$ in the worst case. Required memory is directly related with the length of input sequence. Due to the algorithm complexity of the function used to identify unique numbers at step 4, implementation time of the function \code{adaptive.chi.square} increases quadratically along with the length of input sequence. + +\subsection{Birthday Spacings} + +The Birthday Spacings test was given by \citet{marsaglia}. It focuses on the number of duplicated values of spacings between ordered birthdays among a year of pre-determined length. The observed duplication patterns in input numbers are compared with the patterns that should be observed under randomness. Thus, birthday spacings test detects deviations from randomness by focusing on repetition frequency of numbers to ensure uniformity. \citet{marsaglia} propose that the number of duplicated values is approximately distributed according to the Poisson distribution. They also derive an expression for the mean rate of the Poisson distribution. + +The function \code{birthday.spacings()} is employed to run the test. It implements the following pseudo-code algorithm: \\ + +\noindent{\bf Algorithm 2.} +\begin{enumerate} + \item Input data as a vector of integers of size $n$, the number of birthdays $(m)$, the length of year $(N)$, the mean rate of the theoretical Poisson distribution $(\lambda)$, and the number of classes $(k)$ that is constructed for goodness-of-fit tests; + \item Reshape the first $m\cdot\lfloor n/m\rfloor$ elements of input vector as a matrix of $\lfloor n/m\rfloor$ rows and $m$ columns; + \item Sort each row of the matrix of step 2 according to the values in columns; + \item For each row, find the distance between columns of the sorted matrix by extracting the values in the columns at the previous step; + \item Count duplicated values among the distances obtained at step 4; + \item Calculate class probabilities over the Poisson distribution with mean rate $\lambda$ for $x=0,\dots,k$, and assign the rest of probability mass to the $(k+1)$-th class; + \item Calculate expected frequencies corresponding to the probabilities obtained at the previous step; + \item Replicate the expected counts to form the corresponding sample; + \item Apply the Anderson-Darling test to compare goodness-of-fit of the samples obtained at steps 5 and 8; + \item Apply the Kolmogorov-Smirnov test to compare goodness-of-fit of the samples obtained at steps 5 and 8; + \item Construct frequency table of the counts obtained at step 5; + \item Apply chi-square test over the frequency tables obtained at steps 7 and 11; + \item Return the values of test statistics, corresponding p-values, and decisions on the null hypothesis. +\end{enumerate} + +At step 2 of Algorithm 2, each row of the reshaped matrix includes birthdays in columns. Total number of rows determines the size of sample that is used in goodness-of-fit tests applied at steps 9, 10, and 12. Manipulation of the input vector according to the birthday spacings test is completed at step 5. This manipulation produces the empirical sample in testing the goodness-of-fit to Poisson distribution. The Anderson-Darling test at step 9 is applied by using function \code{ad.test} from the package \CRANpkg{ksamples}. The Kolmogorov-Smirnov test at step 10 is applied by using function \code{ks.test} from the package \CRANpkg{stats}. + +\citet{marsaglia} give some insight into the optimal values of parameters. The mean rate is $\lambda=m^{3}/(4n)$. They state that for an RNG, it is harder to pass this test for increasing values of either $m$ or $n$. Specifically, the case with $m=4096$ and $n=2^{32}$ is qualified as a compelling setting for 32-bit generators. Length of the input sequence is another important parameter. Because the size of sample used in testing the goodness-of-fit is equal to $\lfloor n/m\rfloor$, the length of the input sequence ($n$) should be chosen large enough to apply the goodness-of-fit tests appropriately. + +Algorithm complexity of the function \code{birthday.spacings()} is $O(n^{2})$ in the worst case. The limitation of \code{birthday.spacings()} is directly related with the value of $m$. For all combinations of $m$ and $n$ suggested by \citet{marsaglia}, $\lambda$ is equal to 4. Following this logic, when $n=2^{64}$ the value of $m$ giving $\lambda=4$ is 6,658,043. In this case, for a reliable application of goodness-of-fit tests at steps 9, 10, and 12, we need at least 133,160,860 integers and correspondingly 8,522,295,040 bits. For bit lengths higher than 32, the value of $\lambda$ can be taken as 2. For instance, when $n=2^{64}$, the corresponding value of $m$ is 5,284,492. Thus, decreasing the value of $\lambda$ does not overcome the need for a huge data set for a reliable testing. Note that use of huge data set for testing is a memory consuming operation. + +\subsection{Book Stack} + +The Book Stack test was proposed by \citet{ryabko2005}. Positions of the numbers on a stack are taken into consideration. In this test, randomness implies that frequency of finding each number at each position is equally likely. Departures from this equality mean that some of the words are seen more frequently in contrast to the nature of randomness. The book stack test focuses on non-uniform patterns and frequent repetitions of input numbers to detect deviations from randomness by means of unexpected autocorrelation patterns and non-uniformity. + +The function \code{book.stack()} implements the following pseudo-code algorithm to run the test: \\ + +\noindent{\bf Algorithm 3.} +\begin{enumerate} + \item Input data as a matrix of bits or a vector of integers and the number of subsets $(k)$ that the alphabet will be divided into; + \item If data are represented by bits, transform data to base-10; + \item Form an array that includes the numbers from 1 to the number of unique words in the input sequence; + \item Write each element of the input vector in place of the first element of the array formed at the previous step, and move the other elements except the one written to the first cell of the array one step right; + \item Record the array obtained at the previous step; + \item Go back to step 4 until all elements of the input vector are taken into account; + \item Divide the whole alphabet into $k$ non-overlapping subsets $(A_{1},A_{2},\dots,A_{k})$; + \item For each subset of alphabet, find the frequency of occurrences of the number corresponding to the position of each element of input vector in the arrays formed at steps 4 and 5; + \item Apply chi-square test with expected counts equal to $n\cdot A_{i}$, where $i=1,\dots,k$ and $n$ is the length of input vector or number of columns of input matrix; + \item Return the value of test statistic, corresponding p-value, and decision on the null hypothesis. +\end{enumerate} + +In order to get an integer number of subsets, the length of input vector should be determined to get an integer as the length of subsets. Optimal value for the length of input vector is given as $n\approx B\cdot 2^{B/2}$, where $B$ is the bit-length of considered RNG \citep{ryabko2005,ryabko2006,ryabko2006_2}. For an appropriate determination of number of subsets, $k$, \citet{ryabko2005} suggest performing an empirical study. As for an appropriate bit-length, it is mentioned by \citet{ryabko2005} that it is hard to set up a sensible test with much higher bit-lengths. + +Algorithm complexity of the function \code{book.stack()} is $O(n^{2})$ in the worst case. The limitation of the Book Stack test is based on the bit-length of considered RNG. For example, for $B=64$ the length of input vector is calculated as $1.37\cdot 10^{11}$ and we need 1 terabyte memory whereas the memory requirement is 4 megabytes for $B=32$. Due to both memory and sensibility issues, it is not appropriate to work with high bit-lengths such as 64. + +\subsection{Greatest Common Divisor} + +Two tests proposed by \citet{marsaglia} are based on the number of required iterations $(k)$ and the value of greatest common divisor (GCD) obtained in the GCD operation. When perceived as random variables, both $k$ and GCD are independently and identically distributed and their distributions can be obtained under randomness. \citet{marsaglia} derived distributions of $k$ with an empirical study and that of GCD theoretically under the null hypothesis of randomness. Departures from randomness imply nonconformity between empirical and theoretical distributions of $k$ and GCD. Thus, these tests focus on the deviations from independence and uniformity. + +The function \code{gcd.test()} is called to apply the test. The following pseudo-code algorithm is implemented by \code{gcd.test()} when all of the goodness-of-fit tests are set to \code{TRUE}: \\ + +\noindent{\bf Algorithm 4.} +\begin{enumerate} + \item Input data as an $N\times 2$ matrix of integers, mean and standard deviation of theoretical normal distribution of $k$; + \item Constitute a pair of numbers from each row of input matrix; + \item Apply GCD operation to each pair formed at the previous step; + \item Store values of $k$ for $N$ pairs; + \item If obtained GCD is less than 3, store it as 3 and if that of GCD is greater than 35, store it as 35; + \item Generate a random sample of size $N$ from normal distribution with input values of mean and standard deviation. + \item If the tests based on $k$ will be conducted, go to the next step, otherwise go to step 13; + \item Apply the two sample Kolmogorov-Smirnov test in a two-sided setting to samples obtained at steps 4 and 6; + \item Apply the chi-square test to samples obtained at steps 4 and 6; + \item Standardize the values of $k$ by using its empirical mean and standard deviation; + \item Apply the Jarque-Bera test to the standardized sample of step 10; + \item Apply the Anderson-Darling test to samples obtained at steps 4 and 6; + \item If the tests based on GCD will be conducted, go to the next step, otherwise go to step 19; + \item Construct the cumulative distribution function (cdf) of the probability function (pf) of GCD given by \citet{marsaglia}. + \item Obtain theoretical frequencies for GCD over the cdf of step 14. Specifically, if theoretical frequency of GCD is less than 3, store it as 3 and if that of GCD is greater than 35, store it as 35; + \item Replicate the expected counts to form the corresponding sample; + \item Apply the two sample Kolmogorov-Smirnov test in a two-sided setting to samples obtained at steps 5 and 16; + \item Apply the chi-square test to samples obtained at steps 5 and 16; + \item Return the values of calculated test statistics, corresponding p-values, and decisions on the null hypothesis. +\end{enumerate} + +Mean and standard deviation of theoretical normal distribution for bit lengths other than 32 are not given by \citet{marsaglia}. We conducted extensive empirical studies, details of which are mentioned in following sections, to obtain these parameters and tabulated obtained values in Table \ref{tbl5}. + +When bit-length is increased, corresponding value of GCD mostly becomes greater than 35; hence, the operation at step 15 of Algorithm 4 gets unreasonable. Thus, we observe that it is not appropriate to conduct tests based on GCD for high bit-lengths such as 128. + +The Kolmogorov-Smirnov and chi-square tests at steps 8 and 17, and 9 and 18 are applied by using functions \code{ks.test} and \code{chisq.test} from the package \CRANpkg{stats}, respectively. The Jarque-Bera test at step 11 is implemented by using the function \code{jarque.bera.test} from the package \CRANpkg{tseries}. The Anderson-Darling test is applied by using the function \code{ad.test} from the package \CRANpkg{ksamples}. + +Calculations of the number of required iterations and the value of GCD are time consuming tasks for bit-lengths greater than 64. To overcome this difficulty, we prepared three functions to calculate GCD-related variables. The first function \code{GCD.q} computes the number of required iterations, the value of GCD, and the sequence of partial quotients by using the Euclidean algorithm. The function \code{GCD} is the recursive version of the Euclidean algorithm and it only provides the number of required iterations and the value of GCD. The function \code{GCD.big} applies the Euclidean algorithm over multiple precision floating point numbers using the \CRANpkg{Rmpfr} and provides all three outputs related with the GCD operation. While \code{GCD} is the fastest one, \code{GCD.big} gives the most precise results. It is also possible to use the binary GCD algorithm to decrease the implementation time. However, in this case it is not possible to apply tests over the number of required iterations of the Euclidean algorithm. When the GCD operation is done recursively, the algorithm complexity of \code{gcd.test()} is $O(\log(a))$, where $a$ is the maximum initial input to the recursive algorithm. Memory requirement for GCD tests is directly related with the value of $N$. + +\subsection{Random walk tests} + +In the literature, binary sequences are analyzed in detail by using random walk process. \citet{doganaksoy06} proposed three tests based on the random walk stochastic process. In a random walk process, magnitude or direction of each change is determined by chance; hence, a random walk is random if increment and decrement probabilities are equal to each other. Therefore, random walk processes provide a good basis for randomness. In a random walk, a part of sequence that intersects the $x$-axis with two successive points is called excursion, and over all excursions, the maximum distance from the $x$-axis is defined as height, and the vertical distance between minimum and maximum points over $y$-axis is called expansion. Thus, we have three characteristics of random walk process to observe deviations from randomness. The corresponding tests are called Random Walk Excursion, Random Walk Height, and Random Walk Expansion. If there is a trend in the process, input sequence fails in the excursion test. The height test focuses on the moves with very low or high magnitude to detect non-randomness. The expansion test focuses on the anomalies in amplitude of the walk to identify non-random patterns. Because the exact probabilities corresponding to test statistics are calculated, the tests proposed by \citet{doganaksoy06} are also applicable for small sample sizes. + +The function \code{random.walk.tests()} is called to apply three tests, selectively. The following pseudo-code algorithm is implemented by \code{random.walk.tests()} when all of the tests are to be applied: \\ + +\noindent{\bf Algorithm 5.} +\begin{enumerate} + \item Input data as a matrix of bits of dimension $B\times k$, where $B$ is the bit length and $k$ is the length of input sequence; + \item Transform the input values from $\{0,1\}$ to $\{-1,1\}$; + \item To apply the expansion, excursion, and height tests go to steps 4, 6, and 7, respectively; + \item For each non-overlapping set of length $B$, sum adjacent bits starting from the first bit and increasing by one at each iteration (By this way, we get $B$ summations for each number of interest). + \item For the Expansion test, count and store the summations of the previous step equal to zero; + \item For the Excursion test, calculate the maximum summation and the absolute value of the minimum summation among those of step 4 and store their sum; + \item For the Height test, store absolute maximum of summations obtained at step 4; + \item Calculate theoretical cdf's and pf's for the tests regarding bit-lengths and probabilities tabulated by \citet{doganaksoy06}. + \item Calculate empirical cdf's and pf's over the counts obtained at steps 5, 6, and 7; + \item Replicate the expected and empirical pf's to form the corresponding samples; + \item Apply the Anderson-Darling test to samples obtained at the previous step; + \item Apply the two sample Kolmogorov-Smirnov test in a two-sided setting to samples obtained at step 10; + \item Apply the chi-square test to samples obtained at step 10; + \item Return the values of calculated test statistics, corresponding p-values, and decisions on the null hypothesis. + +\end{enumerate} + +The Anderson-Darling test at step 9 is applied by using function \code{ad.test} from the package \CRANpkg{ksamples}. The Kolmogorov-Smirnov test at step 10 is applied by using function \code{ks.test} from the package \CRANpkg{stats}. The chi-square test at step 11 is the classical application of the test without using a predefined function. If one of the tests is not applied, all the results related with that test in output are set to -1. + +Algorithm complexities of expansion, excursion, and height tests are $O(B)$, $O(B\lfloor k\cdot B\rfloor)$, and $O(B\lfloor k\cdot B\rfloor)$, respectively. The limitation of the tests is unavailability of theoretical cdf's for bit-lengths other than 32, 64, 128, and 256. Therefore, using the information given by \citet{doganaksoy06} the excursion is applied for bit-lengths of 16, 32, 64, 128, and 256; the height test is applied for bit-lengths of 64, 128, 256, 512, and 1024; and the expansion test is applied for bit-lengths of 32, 64, and 128. Although the size of required memory increases along with the length of input sequence, it is possible to apply the tests with reasonable sequence lengths without causing memory pressure. + +\subsection{Topological binary} + +The topological binary test was proposed by \citet{alcover} to test the randomness in bit sequences. The logic behind the test is based on the number of different fixed-length bit patterns in a bit sequence. Frequency of distinct non-overlapping bit patterns over the sequence of interest is influential on the test result. In case of randomness, we expect to have many different bit patterns in the input sequence. The main strength of the topological binary test is that it focuses on the number of bit patterns rather than frequency of occurrence of numbers. Because the exact distribution of test statistic is derived, it is possible to apply the test for short bit sequences. + +The function \code{topological.binary()} implements the following pseudo-code algorithm to run the test: \\ + +\noindent{\bf Algorithm 6.} +\begin{enumerate} + \item Input data as a $B\times k$ matrix of bits, where $B$ is the bit-length and $k$ is the length of considered number sequence, and the critical value; + \item Find and store non-overlapping blocks of length $B$; + \item Count the number of different $B$-bit patterns that appear across all the $k$ blocks; + \item If the result of step 3 is less than one, then reject the null hypothesis; + \item else if the result of step 3 is greater than $\min(k,2^{B})$, then do not reject the null hypothesis; + \item else if the result of step 3 is less than the input critical value, then reject the null hypothesis; + \item else do not reject the null hypothesis; + \item Return the result of step 3 as the value of test statistic and the decision on the null hypothesis. +\end{enumerate} + +Although the exact distribution of test statistic is derived by \citet{alcover}, calculation of the Stirling numbers of the second kind with large inputs is required with bit-lengths greater than 16 for the calculation of cdf of the tests statistic. Therefore, it is hard to obtain the critical value of the test for large bit-lengths by using available functions in R packages such as the function \code{Stirling2} of \CRANpkg{copula}. This case is a limitation of the function \code{topological.binary()}. To overcome this limitation of the test, we prepared the function \code{TBT.CriticalValue} to calculate required critical values for testing. Algorithm complexity of the function \code{topological.binary()} is $O(n^{2})$ in the worst case. The required memory to run the topological binary test is related with the value of $k$. + +\subsection{Auxiliary functions} + +The package \CRANpkg{CryptRndTest} has seven auxiliary functions, namely \code{Strlng2()}, \code{GCD()}, \code{GCD.q()}, \code{GCD.big()}, \code{toBaseTwo()}, \code{toBaseTen()}, and \code{TBT.CriticalValue()}. These functions are also suitable for individual use. \code{Strlng2()} is used to calculate critical values for the topological binary test implemented by \code{TBT.CriticalValue()}. \code{GCD()} and \code{GCD.q()} are called to calculate the greatest common divisor in the GCD test implemented by \code{gcd.test()}. Three possible outcomes of the greatest common divisor operation are the number of iterations, the sequence of partial quotients, and the value of greatest common divisor. \code{GCD()} provides all of these outcomes for any pair of integers excluding zero. Functions \code{toBaseTwo()} and \code{toBaseTen()} are used for base conversion from base 2 to 10 and vice versa for large integers. + +The function \code{Strlng2()} is used to compute natural logarithm of Stirling numbers of the second kind for large values of inputs in an approximate manner by the approaches of \citet{bleick} and \citet{temme}. In this approach, Lambert W functions are employed at the log scale to overcome memory overflows. + +Due to the large factorials in the calculation of Stirling numbers of the second kind, it is nearly impossible to compute exact cdf of the topological binary test statistic for higher bit lengths without memory flows in R. The function \code{TBT.CriticalValue()} implements an approach for the calculation of cdf and approximately computes the required critical value for the topological binary test at a given level of $\alpha$. Because \code{TBT.CriticalValue()} utilizes \code{Strlng2()}, accuracy of results decreases with increasing bit lengths and number of words under consideration. It is also possible to make exact calculations by \code{TBT.CriticalValue()}. In this case, the function \code{Stirling2} from the package \CRANpkg{gmp} is employed instead of \code{Strlng2()}. Because the \CRANpkg{gmp} uses multiple precision arithmetic, implementation time of \code{TBT.CriticalValue()} considerable increases. User should evaluate the trade off between implementation time and high precision. + +Arguments of main and auxiliary functions of \CRANpkg{CryptRndTest} package are summarized in Table \ref{tblUsage}. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Usage of test and auxiliary functions of \CRANpkg{CryptRndTest} package.} + \begin{tabular}{cll} + \hline + \multicolumn{2}{c}{Function} & Call \\ + \hline + Test & GCD.test() & GCD.test(x, KS = TRUE,CSQ = TRUE, AD = TRUE, JB = TRUE, \\ + & & \multicolumn{1}{r}{test.k = TRUE, test.g = TRUE, mu, sd, alpha = 0.05)} \\ + & random.walk.tests() & random.walk.tests(x, B = 64, Excursion = TRUE, \\ + & & \multicolumn{1}{r}{Expansion = TRUE, Height = TRUE, alpha = 0.05)} \\ + & birthday.spacings() & birthday.spacings(x, m = 128, n = $2^{16}$, alpha = 0.05, lambda, \\ + & & \multicolumn{1}{r}{num.class = 10)} \\ + & adaptive.chi.square() & adaptive.chi.square(x, B, S, alpha = 0.05, bit = FALSE) \\ + & book.stack() & book.stack(A, B, k = 2, alpha = 0.05, bit = FALSE) \\ + & topological.binary() & topological.binary(x, B, alpha = 0.05, critical.value) \\ + \hline + Auxiliary & Strlng2() & Strlng2(n, k, log = TRUE) \\ + & GCD() & GCD(x, y) \\ + & GCD.q() & GCD.q(x, y) \\ + & GCD.big() & GCD.big(x, y, B) \\ + & TBT.CriticalValue() & TBT.criticalValue(m, k, alpha = 0.01, cdf = FALSE, exact = TRUE) \\ + & toBaseTen() & toBaseTen(x, m = 128, prec = 256, toFile = FALSE, file) \\ + & toBaseTwo() & toBaseTwo(x, m = 128, prec = 512, num.CPU = 4) \\ + \hline + \end{tabular} + \label{tblUsage} +\end{table} + +\section{A numerical illustration} + +As a numerical illustration of the package, we employed \CRANpkg{CryptRndTest} to test the randomness of RNG's available in R. By this way, we aim to get results of the tests that have not been applied to RNG's of interest yet, figure out implementation performance of \CRANpkg{CryptRndTest} under various scenarios, and illustrate some issues on the determination of parameters of the tests for considered scenarios. Note that it is impossible to observe the ability to control type-I error (rejection of randomness hypothesis while it is actually true) for the tests with an empirical study such as conducted in this section. + +RNG's of interest are Wichmann-Hill (WH), Marsaglia-Multicarry (MM), Super-Duper (SD), Mersenne-Twister (MT), Knuth-TAOCP-2002 (KT02), Knuth-TAOCP (KT), and L'Ecuyer-CMRG (LE) (see the function \code{Random} in \CRANpkg{base} package for the details of these RNG's). Applied tests are topological binary (TBT), adaptive chi-square (Achi), birthday spacings (BDS), random walk expansion (RWT.Exp), random walk height (RWT.Hei), random walk excursion (RWT.Exc), book stack (BS), and greatest common divisor (GCD). TBT, RWT.Exp, RWT.Hei, and RWT.Exc tests work with binary numbers while the rest of tests take integers as input. BDS and RWT tests are applied separately with each of Anderson-Darling, Kolmogorov-Smirnov, and chi-square goodness-of-fit tests, and GCD test is applied separately with each of Anderson-Darling, Kolmogorov-Smirnov, Jargue-Bera, and chi-square goodness-of-fit tests. The total number of applied randomness tests is 21. All the tests are applied at both 0.01 and 0.05 levels of significance and 8, 16, 32, 64, and 128-bit lengths. Considered lengths of random number sequences for each bit-length are given in Table \ref{tbl2}. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Lengths of random number sequences for different patterns.} + \begin{tabular}{cccc} + \hline + &\multicolumn{3}{c}{Sequence length}\\ + \cline{2-4} + Bit & Short (I) & Medium (II) & Long (III) \\ + \hline + 8 & 256 & 32768 & 65536 \\ + 16 & 16384 & 65536 & 131072 \\ + 32 & 32768 & 131072 & 262144 \\ + 64 & 131072 & 262144 & 524288 \\ + 128 & 131072 & 262144 & 524288 \\ + \hline + \end{tabular} + \label{tbl2} +\end{table} +Because we get unreasonable implementation times for longer sequences at the level of 128-bit, the same sequence lengths as 64-bit are considered for 128-bit numbers. + +To conduct the adaptive chi-square test, we need to determine the value of argument \code{S} and the proportions of training and testing samples. The latter one is taken equal. As for the value of \code{S}, we did not detect a significant change in the test results observed for medium sequence length for all bit-lengths for $S=2,3,4$ in pilot runs. The values greater than 4 increase the implementation time whereas small values decrease resolution. Thus, it is taken as 4 for all bit-lengths to work with a reasonable degrees of freedom in the chi-square test. Also, adaptive chi-square test is applied for all bit-lengths. + +Arguments of the birthday spacings test are the number of birthdays (\code{m}), the length of year (\code{n}), the mean rate of the theoretical Poisson distribution (\code{lambda}), and the number of classes (\code{num.class}), which is used for goodness-of-fit tests. In the experiments, the argument \code{m} was taken as 8, 128, and 4096 for 8, 16, and 32-bit-lengths, respectively. The argument \code{n} was set to $2^{B}$, where $B$ is the bit-length. The argument \code{lambda} was calculated by the formula given by \citet{marsaglia}. The argument \code{num.class} was set to 5 and 10 for 8 and 16-bit and higher lengths, respectively. + +For the book stack test, length of the sample (\code{n}) should be determined and data should be prepared according to the value of \code{n}. Also, the number of subsets that the alphabet will be divided into (\code{k}) should be determined. The formula proposed by \citet{ryabko2005} is used to calculate the value of \code{n}, and we set \code{k}$=$\code{n}$/B$. + +In the GCD test procedure, tests are conducted for two outputs of GCD operation that number of iterations required to find GCD ($k$) and GCD $(g)$ itself. The population distribution of $k$ is well approximated by a normal distribution and parameters of the normal distribution are given by \citet{marsaglia} for 32-bit integers after an extensive numerical study. We observed that the parameters of population distribution differ for different bit-lengths and conducted a numerical study to figure out the values of parameters for considered bit-lengths. For this study, $10^{6}$ 30-bit true random numbers were obtained from the web service ``www.random.org." Then, they were converted to 8, 16, 32, 64, and 128-bit numbers. The GCD operation was applied and mean (\code{mu.GCD}) and standard deviation (\code{sd.GCD}) of $k$ were obtained as given in Table \ref{tbl5} after checking the normality of the empirical distribution by means of descriptive statistics and Anderson-Darling goodness of fit test. The values obtained for 32-bit are very close to those obtained by \citet{marsaglia}. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Mean and standard deviation of population distribution of $k$.} + \begin{tabular}{ccc} + \hline + Bit & \code{mu.GCD} & \code{sd.GCD} \\ + \hline + 8 & 3.9991 & 1.6242 \\ + 16 & 8.8784 & 2.3664 \\ + 32 & 18.4023 & 3.4000 \\ + 64 & 31.3269 & 4.3349 \\ + 128 & 31.8390 & 4.3678 \\ + \hline + \end{tabular} + \label{tbl5} +\end{table} + +As expected, mean of $k$ increases along with bit-length, and it approaches to 35 as treated by \citet{marsaglia}. The mild increase in the values of standard deviations is due to the increasing range of the numbers that can be generated with a given bit-length. Also, the GCD test is applied for all bit-lengths. However, nearly for all 128-bit random numbers, $g>35$. Due to the operation done at step 15 of Algorithm 4, it is unreasonable to conduct the GCD test over $g$ for 128-bit numbers. + +Topological binary test is also applied for all bit-lengths. Critical values for topological binary test are calculated by using the function \code{TBT.criticalValue()} for each bit and sequence length combination and presented in Table \ref{tbl3}. Because the length of sequence being tested cannot be longer than $2^{m}-1$, where $m$ is the bit-length, critical values for medium and long sequences at 8-bit and for long sequences at 16-bit levels are not available in Table \ref{tbl3}. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Critical values for toplogical binary test.} + \begin{tabular}{ccccccc} + \hline + & \multicolumn{3}{c}{$\alpha=0.01$}& \multicolumn{3}{c}{$\alpha=0.05$} \\ + \hline + Bit & Short & Medium & Long & Short & Medium & Long \\ + \hline + 8 & 153 & NA & NA & 153 & NA & NA \\ + 16 & 14423 & 41268 & NA & 14423 & 41266 & NA \\ + 32 & 32767 & 131066 & 262129 & 32767 & 131066 & 262129 \\ + 64 & 131070 & 262113 & 523264 & 131070 & 262113 & 524264 \\ + 128 & 131072 & 262144 & 524288 & 131072 & 262144 & 524288 \\ + \hline + \multicolumn{6}{l}{\scriptsize NA: not available.}\\ + \end{tabular} + \label{tbl3} +\end{table} + +In the application, random numbers were generated by the Function 1 given in R codes of this vignette. Experiments were carried out by the Function 2 of related R codes. In both functions, \code{RNG} is the number indicating employed pseudo random number generator, \code{m} is the bit-length, and \code{len} is the length of the random number sequence. In the function \code{experiments()}, \code{cv.TBT} is the critical value of topological binary test, and \code{mu.GCD} and \code{sd.GCD} are mean and standard deviation of true distribution of $k$, respectively. + +Random number sequences used for the performance analysis are of medium length given in Table \ref{tbl2} and generated by WH generator under each bit level. Five replications were made for each test. Mean implementation times calculated over five replications are shown in Table \ref{tbl4} in seconds. All variances of implementation times are less than 0.01. BDS, RWT, and BS tests were not applied at all bit-lengths due to reasons explained in relevant sections. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Mean implementation time for each test in seconds.} + \begin{tabular}{cccccccccc} + \hline + & & \multicolumn{8}{c}{Tests}\\ + \cline{3-10} + Bit & Length & TBT & Achi & BDS & RWT.Exp & RWT.Hei & RWT.Exc & BS & GCD \\ + \hline + 8 & 32768 & 0.62 & 2.88 & 0.46 & NA & NA & NA & $<0.01$ & 1.31 \\ + 16 & 65536 & 1.70 & 5.70 & 0.46 & NA & NA & 4.33 & 0.02 & 3.74 \\ + 32 & 131072 & 6.68 & 10.88 & 2.10 & NA & 0.26 & 15.99 & 4253.01 & 12.32\\ + 64 & 262144 & 32.05 & 86.31 & NA & 84.21 & 88.74 & 64.68 & NA & 37.36 \\ + 128 & 262144 & 77.16 & 10121.34 & NA & 221.16 & 196.96 & 149.29 & NA & 2657.62 \\ + \hline + \multicolumn{10}{l}{\scriptsize TBT: topological binary, Achi: adaptive chi-square, BDS: birthday spacings, RWT: random walk, Exp: expansion,}\\ + \multicolumn{10}{l}{\scriptsize Hei: height, BS: book stack, GCD: greatest common divisor, Length: the length of random number sequence,}\\ + \multicolumn{10}{l}{\scriptsize NA: not available.}\\ + \end{tabular} + \label{tbl4} +\end{table} + +Implementation times of all tests from 8 to 64-bit levels are all sufficient. For 128 bits, most of the implementation times of Achi and GCD tests are taken by finding unique values in a sequence composed of multiple precision floating-point (mpf) numbers at step 4 of Algorithm 1 and the value of gcd for mpf numbers at step 3 of Algorithm 4, respectively. For these operations, mpf numbers are used via the package \CRANpkg{Rmpfr}. The package \CRANpkg{Rmpfr} is based on GMP GNU library and provides an interface from R to the C \citep{maechler11a,maechler11b}. Due to the use of mpf numbers via the package \CRANpkg{Rmpfr}, there is a considerable increase in implementation time of Achi and GCD tests at 128-bit level. However, the gain in precision is worth the delay in implementation of these tests. Performances of the tests working with binary numbers are all sufficient at 128-bit level. Implementation time of the BS test exponentially increases along with the bit-length. Although it is reasonable for 32 bits, application of the test for higher bit-lengths requires unreasonable amount of time for implementation. + +All the tests were applied at both $0.01$ and $0.05$ levels of significance. The null hypothesis is ``$H_{0}:$ Sequences generated by the RNG of interest are random" for all tests. At $0.05$ level of significance, test results for all generators of interest are given in Table \ref{tbl6}-\ref{tbl12}. Due to the similarity between results at both levels of significance, those for $0.01$ level are omitted. + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for WH generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + + BDS.AD & 1 & 0 & 0 & 1 & 0 & 0 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 0 & 0 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 \\ + AD.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 0 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl6} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for SD generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 0 & 0 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 \\ + AD.k & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl7} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for MT generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 0 & 1 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 0 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 1 & 0 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + AD.k & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl8} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for MM generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 0 & 1 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 0 \\ + AD.k & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl9} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for LE generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 \\ + AD.k & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl10} +\end{table} + + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for KT02 generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 0 & 0 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 0 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 \\ + CS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 \\ + AD.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + JB.k & 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl11} +\end{table} + +\begin{table}[htbp] + \centering\footnotesize + \caption{Test results for KT generator at 0.05 level of significance.} + \begin{tabular}{cccccccccccccccc} + \hline + &\multicolumn{15}{c}{Bit-length}\\ + \cline{2-16} + & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{2-16} + &\multicolumn{15}{c}{Sequence length}\\ + \cline{2-16} + Test & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + TBT & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + Achi & 1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + BDS.AD & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.KS & 1 & 0 & 0 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + BDS.CS & 0 & 1 & 1 & 0 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + RWT & & & & & & & & & & & & & & & \\ + AD.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + AD.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + AD.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ + KS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exc & - & - & - & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Exp & - & - & - & - & - & - & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + CS.Hei & - & - & - & - & - & - & - & - & - & 0 & 0 & 0 & 0 & 0 & 0 \\ + BS & 1 & 1 & 1 & 1 & 1 & 1 & - & - & - & - & - & - & - & - & - \\ + GCD & & & & & & & & & & & & & & & \\ + KS.k & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 \\ + CS.k & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 \\ + AD.k & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 1 \\ + JB.k & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + KS.g & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & - & - & - \\ + CS.g & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 1 & - & - & - \\ + \hline + \multicolumn{16}{l}{\scriptsize I: short sequence for given bit-length, II: medium sequence for given bit-length, III: long}\\ + \multicolumn{16}{l}{\scriptsize sequence for given bit-length, AD: Anderson-Darling, CS: chi-square, KS: Kolmogorov-Smirnov,}\\ + \multicolumn{16}{l}{\scriptsize JB: Jarque-Bera, Prop: proportion of success in applied tests, - : not available.}\\ + \end{tabular} + \label{tbl12} +\end{table} + +For both levels of significance, success rates of RNGs over the total number of applied tests are given in Table \ref{tbl13}. The total number of applied tests is given in the last row of Table \ref{tbl6} for each test scenario. For example, because the birthday spacings test is not applied for 64 bit-length, the total number of applied tests is 17 for all sequence lengths. Note that the values given in Table \ref{tbl13} should not be confused with issues related with statistical performance of the tests such as type I error or power. Table \ref{tbl13} represents the proportion of RNG's that did not fail in the given number of tests. In addition, because each test is applied individually, the information presented by Table \ref{tbl13} should not be perceived as the results of application of a test battery. + +\begin{table}[htbp] + \centering + \caption{Success rates for RNGs over the tests applied by \CRANpkg{CryptRndTest}.} + \resizebox{\textwidth}{!}{\begin{tabular}{ccccccccccccccccc} + \hline + & & \multicolumn{15}{c}{Bit-length} \\ + \cline{3-17} + Level & & \multicolumn{3}{c}{8} & \multicolumn{3}{c}{16} & \multicolumn{3}{c}{32} & \multicolumn{3}{c}{64} & \multicolumn{3}{c}{128} \\ + \cline{3-17} + of & & \multicolumn{15}{c}{Sequence length} \\ + \cline{3-17} + Significance & RNG & I & II & III & I & II & III & I & II & III & I & II & III & I & II & III \\ + \hline + 0.01 & WH & 0.92 & 0.58 & 0.50 & 0.93 & 1.00 & 0.86 & 0.86 & 0.93 & 0.93 & 0.47 & 0.47 & 0.47 & 0.33 & 0.27 & 0.33 \\ + & SD & 0.92 & 0.58 & 0.75 & 0.93 & 0.93 & 0.93 & 0.93 & 0.93 & 0.93 & 0.41 & 0.47 & 0.35 & 0.33 & 0.33 & 0.27 \\ + & MT & 0.92 & 0.58 & 0.58 & 1.00 & 1.00 & 0.93 & 0.93 & 0.93 & 0.93 & 0.47 & 0.41 & 0.47 & 0.33 & 0.33 & 0.33 \\ + & MM & 0.92 & 0.58 & 0.75 & 0.93 & 0.93 & 1.00 & 1.00 & 0.93 & 0.93 & 0.47 & 0.41 & 0.35 & 0.33 & 0.33 & 0.27 \\ + & LE & 0.92 & 0.67 & 0.58 & 0.93 & 0.93 & 0.79 & 1.00 & 0.93 & 0.93 & 0.47 & 0.47 & 0.47 & 0.33 & 0.27 & 0.33 \\ + & KT & 0.92 & 0.67 & 0.58 & 0.93 & 0.93 & 0.93 & 1.00 & 0.93 & 0.93 & 0.41 & 0.47 & 0.47 & 0.27 & 0.33 & 0.33 \\ + & KT02 & 0.92 & 0.67 & 0.58 & 1.00 & 0.93 & 1.00 & 1.00 & 0.93 & 0.86 & 0.47 & 0.41 & 0.47 & 0.27 & 0.33 & 0.33 \\ + \hline + 0.05 & WH & 0.83 & 0.50 & 0.50 & 0.93 & 0.93 & 0.86 & 0.79 & 0.93 & 0.93 & 0.47 & 0.47 & 0.47 & 0.33 & 0.27 & 0.33 \\ + & SD & 0.92 & 0.58 & 0.75 & 0.93 & 0.93 & 0.86 & 0.86 & 0.79 & 0.86 & 0.41 & 0.47 & 0.29 & 0.33 & 0.33 & 0.27 \\ + & MT & 0.67 & 0.50 & 0.58 & 0.93 & 0.86 & 0.86 & 0.93 & 0.86 & 0.93 & 0.41 & 0.41 & 0.47 & 0.33 & 0.33 & 0.33 \\ + & MM & 0.92 & 0.58 & 0.75 & 0.93 & 0.93 & 0.93 & 1.00 & 0.86 & 0.93 & 0.47 & 0.41 & 0.35 & 0.33 & 0.33 & 0.27 \\ + & LE & 0.92 & 0.67 & 0.58 & 0.93 & 0.93 & 0.79 & 0.93 & 0.86 & 0.93 & 0.47 & 0.41 & 0.47 & 0.33 & 0.27 & 0.33 \\ + & KT & 0.92 & 0.58 & 0.58 & 0.93 & 0.86 & 0.93 & 1.00 & 0.93 & 0.93 & 0.41 & 0.41 & 0.47 & 0.27 & 0.20 & 0.33 \\ + & KT02 & 0.83 & 0.58 & 0.42 & 1.00 & 0.93 & 0.93 & 1.00 & 0.93 & 0.79 & 0.47 & 0.41 & 0.47 & 0.27 & 0.33 & 0.33 \\ + \hline + \multicolumn{2}{r}{Number of tests} & 12 & 12 & 12 & 15 & 15 & 15 & 15 & 15 & 15 & 17 & 17 & 17 & 15 & 15 & 15 \\ + \hline + \end{tabular}} + \label{tbl13} +\end{table} + +In general, proportion of success decreases with increasing sequence and bit-lengths. According to proportions of success, performance of WH generator is satisfactory for 16 and 32-bit numbers for all sequence lengths. The reason of getting a decreasing success rate with increasing bit-length is that the random walk tests with all goodness-of-fit tests and GCD test with Jarque-Bera goodness-of-fit test reject the randomness hypothesis while the rest of the tests mostly accept the hypothesis for bit-lengths greater than 32. In detail, WH generator successfully passes both of the TBT and Achi tests nearly in all bit-sequence length combinations. Results of AD and KS goodness-of-fit tests applied under both BDS and GCD tests (with $k$) are similar, and CS test more likely decides randomness of WH generator. It is unsuccessful in passing the random walk tests for high bit-lengths. BS test concludes WH's randomness under all of the test conditions. GCD with JB goodness-of-fit test rejects the null hypothesis of randomness under all test conditions but the first one. At $0.01$ level of significance, there is nearly no change in the results. WH generator passes the GCD test with CS goodness-of-fit test for $k$ at (8, I), (8, II) and (32, I) scenarios, and the BDS test with AD goodness-of-fit test at (16, II). + +According to proportions of success, SD generator mostly passes the tests for 16 and 32-bit integers for all sequence lengths, and 8-bit integers for short and long sequences. Detailed test results for SD generator at $0.05$ level of significance are similar to that of WH generator for TBT, Achi, BDS, RWT, and BS tests. It is better in GCD test with JB goodness-of-fit test for $k$. At $0.01$ level of significance, CS goodness-of-fit test applied with GCD test cannot reject the null hypothesis for 4 scenarios. + +Reaction of the tests for MT, MM, and LE generators is similar to that of WH generator. According to proportions of success, success rates of MT generator are satisfactory for 16 and 32-bit numbers for all sequence lengths; and that of MM generator is very satisfactory for 16 and 32-bit numbers for all sequence lengths, and 8-bit numbers for short and long sequence lengths. Success proportions of LE, KT, and KT02 generators are high for 16 and 32-bit numbers for all sequence lengths, and 8-bit numbers for short sequences. BS test rejects randomness of KT02 generator for 8-bit numbers for all sequence lengths at $0.05$ level of significance. However, it cannot reject the null hypothesis for 8-bit numbers for all sequence lengths for $\alpha=0.01$. + +For 64-bit numbers, only random walk excursion test with AD and KS goodness-of-fit tests cannot reject the null hypothesis for all RNG's. None of the random walk tests decides randomness of RNG's for 128-bit numbers. RNG's pass TBT, Achi, and GCD for $k$ with AD, KS, and CS goodness-of-fit tests for almost all sequence lengths. This situation decreases the proportion of success for 64 and 128-bit numbers. This result would be due to the conservativeness of random walk height, random walk expansion tests, and GCD test with Jarque-Bera goodness-of-fit test for higher bit lengths. + +\section{Summary} + +Statistical analysis of randomness of a cryptographic random number generator is a critical and necessary task to make use of the generator in cryptographic applications. Many cryptographic randomness tests are available for this task including recently proposed ones. Although there are several alternatives, chi-square test is frequently employed within these cryptographic randomness tests as a goodness-of-fit test. In this regard, this article describes the package \CRANpkg{CryptRndTest} that conducts frequently used and newly proposed 8 cryptographic randomness tests along with Anderson-Darling, Kolmogorov-Smirnov, chi-square, and Jarque-Bera goodness-of-fit tests. Totally, \CRANpkg{CryptRndTest} runs 21 tests. It also provides auxiliary functions for the calculation of greatest common divisor, sequence of partial quotients resulting from the greatest common divisor operation, the base conversion from 2 to 10 and vice versa, and the Stirling numbers of the second kind. All of these auxiliary functions also work with long integers by the use of multi-precision floating point numbers. + +The limitations of the package are mostly related to the memory and CPU capacities of the computer used to run functions of \CRANpkg{CryptRndTest}. Because, increasing bit-length considerably decreases the implementation speed of tests working over integers, this can also be seen as a limitation for high bit-lengths. + +\section{Acknowledgements} +This work is fully supported by The Scientific and Technological Research Council of Turkey (TUBITAK) under Grant No. 114F249 of ARDEB-3001 programme. + +%\bibliographystyle{agsm} +\bibliography{demirhan_Crypt_2015} +\end{article} +\end{document} diff --git a/vignettes/RJournal.sty b/vignettes/RJournal.sty new file mode 100644 index 0000000..8cae4c4 --- /dev/null +++ b/vignettes/RJournal.sty @@ -0,0 +1,335 @@ +% Package `RJournal' to use with LaTeX2e +% Copyright (C) 2010 by the R Foundation +% Copyright (C) 2013 by the R Journal +% +% Originally written by Kurt Hornik and Friedrich Leisch with subsequent +% edits by the editorial board + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{RJournal}[2013/08/27 v0.13 RJournal package] + +\RequirePackage{tikz} + +% Overall page layout, fonts etc ----------------------------------------------- + +% Issues of of \emph{The R Journal} are created from the standard \LaTeX{} +% document class \pkg{report}. + +\RequirePackage{geometry} +\geometry{a4paper, + textwidth=14cm, top=1cm, bottom=1cm, + includehead,includefoot,centering, + footskip=1.5cm} +\raggedbottom + +\RequirePackage{fancyhdr} +\fancyhead{} +\fancyheadoffset{2cm} +\fancyhead[L]{\textsc{\RJ@sectionhead}} +\fancyhead[R]{\thepage} +\fancyfoot{} +\fancyfoot[L]{Vignette for the CRAN Package} +\fancyfoot[R]{CryptRndTest} +\pagestyle{fancy} + +% We use the following fonts (all with T1 encoding): +% +% rm & palatino +% tt & inconsolata +% sf & helvetica +% math & palatino + +\RequirePackage{microtype} + +\RequirePackage[scaled=0.92]{helvet} +\RequirePackage{palatino,mathpazo} +\RequirePackage[scaled=1.02]{inconsolata} +\RequirePackage[T1]{fontenc} + +\RequirePackage[hyphens]{url} +\RequirePackage[pagebackref]{hyperref} +\renewcommand{\backref}[1]{[p#1]} + +% Dark blue colour for all links +\RequirePackage{color} +\definecolor{link}{rgb}{0.45,0.51,0.67} +\hypersetup{ + colorlinks,% + citecolor=link,% + filecolor=link,% + linkcolor=link,% + urlcolor=link +} + +% Give the text a little room to breath +\setlength{\parskip}{3pt} +\RequirePackage{setspace} +\setstretch{1.05} + +% Issue and article metadata --------------------------------------------------- + +% Basic front matter information about the issue: volume, number, and +% date. + +\newcommand{\volume}[1]{\def\RJ@volume{#1}} +\newcommand{\volnumber}[1]{\def\RJ@number{#1}} +\renewcommand{\month}[1]{\def\RJ@month{#1}} +\renewcommand{\year}[1]{\def\RJ@year{#1}} + + +% Individual articles correspond to +% chapters, and are contained in |article| environments. This makes it +% easy to have figures counted within articles and hence hyperlinked +% correctly. + +% An article has an author, a title, and optionally a subtitle. We use +% the obvious commands for specifying these. Articles will be put in certain +% journal sections, named by \sectionhead. + +\newcommand {\sectionhead} [1]{\def\RJ@sectionhead{#1}} +\renewcommand{\author} [1]{\def\RJ@author{#1}} +\renewcommand{\title} [1]{\def\RJ@title{#1}} +\newcommand {\subtitle} [1]{\def\RJ@subtitle{#1}} + +% Control appearance of titles: make slightly smaller than usual, and +% suppress section numbering. See http://tex.stackexchange.com/questions/69749 +% for why we don't use \setcounter{secnumdepth}{-1} + +\usepackage[medium]{titlesec} +\usepackage{titletoc} +\titleformat{\section} {\normalfont\large\bfseries}{}{0em}{} +\titleformat{\subsection}{\normalfont\normalsize\bfseries}{}{0em}{} +\titlecontents{chapter} [0em]{}{}{}{\titlerule*[1em]{.}\contentspage} + +% Article layout --------------------------------------------------------------- + +% Environment |article| clears the article header information at its beginning. +% We use |\FloatBarrier| from the placeins package to keep floats within +% the article. +\RequirePackage{placeins} +\newenvironment{article}{\author{}\title{}\subtitle{}\FloatBarrier}{\FloatBarrier} + +% Refereed articles should have an abstract, so we redefine |\abstract| to +% give the desired style + +\renewcommand{\abstract}[1]{% +\setstretch{1}% +\noindent% +\small% +\textbf{Abstract} #1 +} + +% The real work is done by a redefined version of |\maketitle|. Note +% that even though we do not want chapters (articles) numbered, we +% need to increment the chapter counter, so that figures get correct +% labelling. + +\renewcommand{\maketitle}{% +\noindent + \chapter{\RJ@title}\refstepcounter{chapter} + \ifx\empty\RJ@subtitle + \else + \noindent\textbf{\RJ@subtitle} + \par\nobreak\addvspace{\baselineskip} + \fi + \ifx\empty\RJ@author + \else + \noindent\textit{\RJ@author} + \par\nobreak\addvspace{\baselineskip} + \fi + \@afterindentfalse\@nobreaktrue\@afterheading +} + +% Now for some ugly redefinitions. We do not want articles to start a +% new page. (Actually, we do, but this is handled via explicit +% \newpage +% +% The name@of@eq is a hack to get hyperlinks to equations to work +% within each article, even though there may be multiple eq.(1) +% \begin{macrocode} +\renewcommand\chapter{\secdef\RJ@chapter\@schapter} +\providecommand{\nohyphens}{% + \hyphenpenalty=10000\exhyphenpenalty=10000\relax} +\newcommand{\RJ@chapter}{% + \edef\name@of@eq{equation.\@arabic{\c@chapter}}% + \renewcommand{\@seccntformat}[1]{}% + \@startsection{chapter}{0}{0mm}{% + -2\baselineskip \@plus -\baselineskip \@minus -.2ex}{\p@}{% + \phantomsection\normalfont\huge\bfseries\raggedright}} + +% Book reviews should appear as sections in the text and in the pdf bookmarks, +% however we wish them to appear as chapters in the TOC. Thus we define an +% alternative to |\maketitle| for reviews. +\newcommand{\review}[1]{ + \pdfbookmark[1]{#1}{#1} + \section*{#1} + \addtocontents{toc}{\protect\contentsline{chapter}{#1}{\thepage}{#1.1}} +} + +% We want bibliographies as starred sections within articles. +% +\RequirePackage[sectionbib,round]{natbib} +\bibliographystyle{abbrvnat} + +% Equations, figures and tables are counted within articles, but we do +% not show the article number. For equations it becomes a bit messy to avoid +% having hyperref getting it wrong. + +% \numberwithin{equation}{chapter} +\renewcommand{\theequation}{\@arabic\c@equation} +\renewcommand{\thefigure}{\@arabic\c@figure} +\renewcommand{\thetable}{\@arabic\c@table} + +% Issue layout ----------------------------------------------------------------- + +% Need to provide our own version of |\tableofcontents|. We use the +% tikz package to get the rounded rectangle. Notice that |\section*| +% is really the same as |\chapter*|. +\renewcommand{\contentsname}{Contents} +\renewcommand\tableofcontents{% + \vspace{1cm} + \section*{\contentsname} + { \@starttoc{toc} } +} + +\renewcommand{\titlepage}{% + \thispagestyle{empty} + \hypersetup{ + pdftitle={The R Journal Volume \RJ@volume/\RJ@number, \RJ@month \RJ@year},% + pdfauthor={R Foundation for Statistical Computing},% + } + \noindent + \begin{center} + \fontsize{50pt}{50pt}\selectfont + The \raisebox{-8pt}{\includegraphics[height=77pt]{Rlogo-4}}\hspace{10pt} + Journal + + \end{center} + {\large \hfill Volume \RJ@volume/\RJ@number, \RJ@month{} \RJ@year \quad} + + \rule{\textwidth}{1pt} + \begin{center} + {\Large A peer-reviewed, open-access publication of the \\ + R Foundation for Statistical Computing} + \end{center} + + % And finally, put in the TOC box. Note the way |tocdepth| is adjusted + % before and after producing the TOC: thus, we can ensure that only + % articles show up in the printed TOC, but that in the PDF version, + % bookmarks are created for sections and subsections as well (provided + % that the non-starred forms are used). + \setcounter{tocdepth}{0} + \tableofcontents + \setcounter{tocdepth}{2} + \clearpage +} + +% Text formatting -------------------------------------------------------------- + +\newcommand{\R}{R} +\newcommand{\address}[1]{\addvspace{\baselineskip}\noindent\emph{#1}} +\newcommand{\email}[1]{\href{mailto:#1}{\normalfont\texttt{#1}}} + +% Simple font selection is not good enough. For example, |\texttt{--}| +% gives `\texttt{--}', i.e., an endash in typewriter font. Hence, we +% need to turn off ligatures, which currently only happens for commands +% |\code| and |\samp| and the ones derived from them. Hyphenation is +% another issue; it should really be turned off inside |\samp|. And +% most importantly, \LaTeX{} special characters are a nightmare. E.g., +% one needs |\~{}| to produce a tilde in a file name marked by |\file|. +% Perhaps a few years ago, most users would have agreed that this may be +% unfortunate but should not be changed to ensure consistency. But with +% the advent of the WWW and the need for getting `|~|' and `|#|' into +% URLs, commands which only treat the escape and grouping characters +% specially have gained acceptance + +\DeclareRobustCommand\code{\bgroup\@noligs\@codex} +\def\@codex#1{\texorpdfstring% +{{\normalfont\ttfamily\hyphenchar\font=-1 #1}}% +{#1}\egroup} +\newcommand{\kbd}[1]{{\normalfont\texttt{#1}}} +\newcommand{\key}[1]{{\normalfont\texttt{\uppercase{#1}}}} +\DeclareRobustCommand\samp{`\bgroup\@noligs\@sampx} +\def\@sampx#1{{\normalfont\texttt{#1}}\egroup'} +\newcommand{\var}[1]{{\normalfont\textsl{#1}}} +\let\env=\code +\newcommand{\file}[1]{{`\normalfont\textsf{#1}'}} +\let\command=\code +\let\option=\samp +\newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} +% \acronym is effectively disabled since not used consistently +\newcommand{\acronym}[1]{#1} +\newcommand{\strong}[1]{\texorpdfstring% +{{\normalfont\fontseries{b}\selectfont #1}}% +{#1}} +\let\pkg=\strong +\newcommand{\CRANpkg}[1]{\href{http://CRAN.R-project.org/package=#1}{\pkg{#1}}}% +\let\cpkg=\CRANpkg +\newcommand{\ctv}[1]{\href{http://CRAN.R-project.org/view=#1}{\emph{#1}}} +\newcommand{\BIOpkg}[1]{\href{http://www.bioconductor.org/packages/release/bioc/html/#1.html}{\pkg{#1}}} + +% Example environments --------------------------------------------------------- +\RequirePackage{fancyvrb} +\RequirePackage{alltt} + +\DefineVerbatimEnvironment{example}{Verbatim}{} +\renewenvironment{example*}{\begin{alltt}}{\end{alltt}} + +% Support for output from Sweave, and generic session style code +% These used to have fontshape=sl for Sinput/Scode/Sin, but pslatex +% won't use a condensed font in that case. + +\DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small} +\DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} +\DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small} +\DefineVerbatimEnvironment{Sin}{Verbatim}{fontsize=\small} +\DefineVerbatimEnvironment{Sout}{Verbatim}{fontsize=\small} +\newenvironment{Schunk}{}{} + +% Mathematics ------------------------------------------------------------------ + +% The implementation of |\operatorname| is similar to the mechanism +% \LaTeXe{} uses for functions like sin and cos, and simpler than the +% one of \AmSLaTeX{}. We use |\providecommand| for the definition in +% order to keep the one of the \pkg{amstex} if this package has +% already been loaded. +% \begin{macrocode} +\providecommand{\operatorname}[1]{% + \mathop{\operator@font#1}\nolimits} +\RequirePackage{amsfonts} + +\renewcommand{\P}{% + \mathop{\operator@font I\hspace{-1.5pt}P\hspace{.13pt}}} +\newcommand{\E}{% + \mathop{\operator@font I\hspace{-1.5pt}E\hspace{.13pt}}} +\newcommand{\VAR}{\operatorname{var}} +\newcommand{\COV}{\operatorname{cov}} +\newcommand{\COR}{\operatorname{cor}} + +% Figures ---------------------------------------------------------------------- + +\RequirePackage[font=small,labelfont=bf]{caption} + +% Wide environments for figures and tables ------------------------------------- +\RequirePackage{environ} + +% An easy way to make a figure span the full width of the page +\NewEnviron{widefigure}[1][]{ +\begin{figure}[#1] +\advance\leftskip-2cm +\begin{minipage}{\dimexpr\textwidth+4cm\relax}% + \captionsetup{margin=2cm} + \BODY +\end{minipage}% +\end{figure} +} + +\NewEnviron{widetable}[1][]{ +\begin{table}[#1] +\advance\leftskip-2cm +\begin{minipage}{\dimexpr\textwidth+4cm\relax}% + \captionsetup{margin=2cm} + \BODY +\end{minipage}% +\end{table} +} diff --git a/vignettes/demirhan_Crypt_2015.bib b/vignettes/demirhan_Crypt_2015.bib new file mode 100644 index 0000000..c711d1e --- /dev/null +++ b/vignettes/demirhan_Crypt_2015.bib @@ -0,0 +1,556 @@ + +@article{bogdanov14, + title={Rmind: a tool for cryptographically secure statistical analysis}, + journal={IACR Cryptology ePrint Archive}, + volume={2014}, + pages={512}, + author={Dan Bogdanov and Liina Kamm and Sven Laur and Ville Sokk}, + year=2014 +} + +@misc{CryptRndTest, + title = {CryptRndTest: Statistical Tests for Cryptographic Randomness}, + howpublished = {\url{https://stat.ethz.ch/XXX.html}}, + note = {Online; accessed 2015-01-19} +} + +@misc{RDieHarder, + title = {RDieHarder: R interface to the dieharder RNG test suite}, + howpublished = {\url{http://cran.r-project.org/web/packages/RDieHarder/index.html}}, + note = {Online; accessed 2015-06-16} +} + +@MISC{eddelbuettel_bronw, + author = {D. Eddelbuettel and R.G. Brown}, + title = {RDieHarder: An R interface to the DieHarder suite of Random Number Generator Tests}, + howpublished = {\url{http://cran.r-project.org/web/packages/RDieHarder/vignettes/RDieHarder.pdf}}, + note = "[Online; accessed 16-June-2015]", + year= {2014} +} + +@MISC{Maechler11a, + author = {M. Maechler}, + title = {Arbitrarily accurate computation with R: Package ?Rmpfr?}, + note = "[Online; accessed 18-December-2015]", + year= {2011} +} + +@MISC{Maechler11b, + author = {M. Maechler}, + title = {Rmpfr: R MPFR - Multiple Precision Floating-Point Reliable. R package version 0.4-2}, + howpublished = {\url{https://cran.r-project.org/web/packages/Rcpp/Rcpp.pdf}}, + note = "[Online; accessed 18-December-2015]", + year= {2011} +} + +@Article{demirhan10, + author = {H. Demirhan and N.A. Dolgun and Y. Parlak Demirhan and M.O. Dolgun}, + title = {Performance of some multiple comparison tests under heteroscedasticity and dependency}, + journal = {Journal of Statistical Computation and Simulation}, + volume = {80}, + pages = {1083--1100}, + year = {2010} +} + +@Article{demirhan15, + author = {H. Demirhan and N. Bitirim}, + title = {Statistical testing of cryptographic randomness}, + journal = {Journal of Statisticians: Statistics and Actuarial Sciences}, + volume = {Submitted}, + year = {2015} +} + +@Article{demirhan16, + author = {H. Demirhan and N. Bitirim}, + title = {CryptRndTest: An R package for testing the cryptographic randomness}, + journal = {The R Journal}, + volume = {Submitted}, + year = {2015} +} + +@Article{bleick, + author = {W.W. Bleick and P.C.C. Wang}, + title = {Asymptotics of Stirling Numbers of the Second Kind}, + journal = {Proceedings of the American Mathematical Society}, + volume = {42}, + pages = {575--580}, + year = {1974} +} + +@Article{temme, + author = {N.M. Temme}, + title = {Asymptotic estimates of Stirling numbers}, + journal = {Studies in Applied Mathematics}, + volume = {89}, + pages = {233--243}, + year = {1993} +} + +@Article{sidak67, + author = {Z.K. Sidak}, + title = {Rectangular Confidence Regions for the Means of Multivariate Normal Distributions}, + journal = {Journal of the American Statistical Association}, + volume = {62}, + pages = {626--633}, + year = {1967} +} + +@Article{dunn61, + author = {O.J. Dunn}, + title = {Multiple Comparisons among Means}, + journal = {Journal of the American Statistical Association}, + volume = {56}, + pages = {52--64}, + year = {1961} +} + + +@Article{alani, + author = {M.M. Alani}, + title = {Testing randomness in ciphertext of block-ciphers using DieHard tests}, + journal = {International Journal of Computer Science and Network Security}, + volume = {10}, + pages = {53--57}, + year = {2010} +} + + +@Article{alcover, + author = {P.M. Alcover and A. Guillamon and M.C. Ruiz}, + title = {A new randomness test for bit sequences}, + journal = {Informatica}, + volume = {24}, + pages = {339--356}, + year = {2013} +} + + +@Article{andrasiu, + author = {M. Andrasiu and A. Popescu and G. Simion}, + title = {Statistical evaluation of cryptographic algorithms}, + journal = {8th International Conference on Communications}, + volume = {}, + pages = {473--476}, + year = {2010} +} + + +@MISC{bronw14, + author = {R.G. Brown and D. Eddelbuettel and D. Bauer}, + title = {Dieharder: A Random Number Test Suite (version 3.31.1)}, + howpublished = {URL: http://www.phy.duke.edu/~rgb/General/dieharder.php}, + note = "[Online; accessed 25-February-2014]", + year= {2014} +} + + +@Article{davis, + author = {D. Davis and I. Ross and P. Fenstermacher}, + title = {Cryptographic randomness from air turbulence in disk drives}, + journal = {Advances in Cryptology CRYPTO 94}, + volume = {}, + pages = {114--120}, + year = {1994} +} + +@inproceedings{doganaksoy06, + author = {A. Doganaksoy and C. Calik and F. Sulak and M.S. Turan}, + address = {Turkey}, + booktitle = {Proceedings of National Cryptology Symposium II}, + editor = {}, + keywords = {}, + howpublished = {}, + language = {eng}, + location = {Turkey}, + isbn = {}, + pages = {}, + publisher = {}, + title = {New randomness tests using random walk}, + year = {2006} +} + +@Article{hernandez, + author = {J.C. Hernandez and J.M. Sierra and A. Seznec}, + title = {The SAC test: a new randomness test, with some applications to PRNG analysis}, + journal = {In:Proceedings of the International Conference Computational Science and Its Applications}, + volume = {}, + pages = {960--967}, + year = {2004} +} + +@MISC{walsh, + author = {B. Walsh}, + title = {Multiple comparisons: Bonferroni corrections and false discovery rates}, + howpublished = {http://nitro.biosci.arizona.edu/workshops/Aarhus2006/pdfs/Multiple.pdf}, + source={Lecture notes for EEB 581}, + note = "[Online; accessed 19-December-2014]", + year= {2006} +} + +@MISC{kenny, + author = {C. Kenny}, + title = {Random number generators: An evaluation and comparison of random.org and some commonly used generators}, + source={Trinity College Dublin Management Science and Information Systems Studies Project Report}, + howpublished = {\url{http://www.random.org/analysis/Analysis2005.pdf}}, + note = "[Online; accessed 24-February-2014]", + year= {2005} +} + +@Book{freund, + author = {J.E. Freund and B.M. Perles}, + title = {Statistics A First Course}, + publisher = {Prentice Hall}, + address = {New Jersey}, + edition = {8}, + year = {2003} +} + +@Book{tamhane, + author = {Y. Hochberg and A.C. Tamhane}, + title = {Multiple Comparison Procedures}, + publisher = {Wiley}, + address = {New York}, + year = {1987} +} + +@INBOOK{maaranen, + author = {H. Maaranen and K. Miettinen and M.M. Makela}, + editor = {Rudnicki, Marek, Wiak, Slawomir}, + title = {Using Quasi Random Sequences in Genetic Algorithms}, + chapter = {AA}, + pages = {33-44}, + publisher = {Springer}, + year = {2003} +} + + + +@Book{geza, + author = {S. Geza}, + title = {Introduction to Probability with Statistical Applications}, + publisher = {Birkh\"{a}user}, + address = {Boston}, + edition = {}, + year = {2007} +}%sy 235 + +@Book{Knuth1969, + author = {D.E. Knuth}, + title = {The Art of Computer Programming, Volume 2 / Seminumerical Algorithms}, + publisher = {Addison-Wesley}, + address = {Reading, Massachusetts}, + edition = {1}, + year = {1969} +} + + +@Book{Knuth1981, + author = {D.E. Knuth}, + title = {The Art of Computer Programming, Volume 2 / Seminumerical Algorithms}, + publisher = {Addison-Wesley}, + address = {Reading, Massachusetts}, + edition = {2}, + year = {1981} +} + + +@Book{Knuth1998, + author = {D.E. Knuth}, + title = {The Art of Computer Programming, Volume 2 / Seminumerical Algorithms}, + publisher = {Addison-Wesley}, + address = {Reading, Massachusetts}, + edition = {3}, + year = {1998} +} + + +@Article{lecuyer1998, + author = {P. L'Ecuyer and P. Hellekalek}, + title = {Random number generators: Selection criteria and testing}, + journal = {Random and Quasi-Random Point Sets Lecture Notes in Statistics}, + volume = {138}, + pages = {223--265}, + year = {1998} +} + + +@Article{lecuyer2007, + author = {P. L'Ecuyer and R. Simard}, + title = {TestU01: A C library for empirical testing of random number generators}, + journal = {ACM Transactions on Mathematical Software}, + volume = {33}, + pages = {Article 22}, + year = {2007} +} + + +@MISC{testu01, + author = {P. L'Ecuyer and R. Simard}, + title = {TestU01: A C library for empirical testing of random number generators - User's guide, compact version.}, + howpublished = {\url{http://www.iro.umontreal.ca/~simardr/testu01/guideshorttestu01.pdf}}, + note = "[Online; accessed 24-February-2014]", + year= {2014} +} + + +@MISC{diehard, + author = {G. Marsaglia}, + title = {DIEHARD: A battery of tests of randomness}, + howpublished = {\url{http://stat.fsu.edu/~geo/diehard.html}}, + note = "[Online; accessed 25-February-2014]", + year= {1996} +} + + +@Article{marsaglia, + author = {G. Marsaglia and W.W. Tsang}, + title = {Some difficult to pass tests of randomness}, + journal = {Journal of Statistical Software}, + volume = {7}, + pages = {3}, + year = {2002} +} + + +@Article{maurer, + author = {U.M. Maurer}, + title = {A universal statistical test for random bit generators}, + journal = {Journal of Cryptology}, + volume = {5}, + pages = {89--105}, + year = {1992} +} + +@Article{maurer91, + author = {U.M. Maurer and J.L. Massey}, + title = {Local randomness in pseudorandom sequences}, + journal = {Journal of Cryptology}, + volume = {4}, + pages = {135--149}, + year = {1991} +} + +@Article{marton, + author = {K. Marton and A. Suciu and C. Sacarea and O. Cret}, + title = {Generation and Testing of Random Numbers for Cryptographic Applications}, + journal = {The Publishing House of the Romanian Academy}, + volume = {4}, + pages = {368--377}, + year = {2012} +} + + +@Article{mascagni, + author = {M. Mascagni and A. Srinivasan}, + title = {Algorithm 806: SPRNG: A scalable library for pseudorandom number generation}, + journal = {ACM Transactions on Mathematical Software}, + volume = {26}, + pages = {436--461}, + year = {2000} +} + +@Article{mccullough, + author = {B.D. McCullough}, + title = {A Review of Testu01}, + journal = {Journal of Applied Econometrics}, + volume = {21}, + pages = {677--682}, + year = {2006} +} + + +@Book{menezes, + author = {A.J. Menezes and P.C. van Oorschot and S.A. Vanstone}, + title = {Handbook of Applied Cryptography}, + publisher = {CRC Press}, + address = {New York}, + edition = {}, + year = {1996} +} + + +@MISC{R, + author = {{R Core Team}}, + title = {R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria}, + howpublished = {\url{http://www.R-project.org}}, + note = "[Online; accessed 26-February-2015]", + year= {2015} +} + + +@Article{reddy, + author = {T.C. Reddy and R. Seshadri}, + title = {New Design of Crypto-Based Pseudo random number generator (CBPRNG) using BLOW FISH cipher}, + journal = {International Journal on Computer Science and Engineering}, + volume = {5}, + pages = {561--566}, + year = {2013} +} +%and S. Leigh and M. Levenson and M. Vangel and D. Banks and A. Heckert and J. Dray and S. Vo +@MISC{rukhinetal10, + author = {A. Rukhin and J. Soto and J. Nechvatal and M. Smid and E. Barker and S. Leigh and M. Levenson and M. Vangel and D. Banks and A. Heckert and J. Dray and S. Vo}, + title = {A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications}, + howpublished = {\url{http://csrc.nist.gov/groups/ST/toolkit/rng/documents/SP800-22rev1a.pdf}}, + note = "[Online; accessed 17-June-2015]", + year= {2010} +} + +@Article{rukhin, + author = {A.L. Rukhin}, + title = {Testing randomness: A suite of statistical procedures}, + journal = {Theory of Probability and Its Applications}, + volume = {45}, + pages = {111--132}, + year = {2001} +} + + +@Book{rutti, + author = {M. Ruetti}, + title = {A Random Number Generator Test Suite for the C++ Standard-Diploma Thesis}, + publisher = {Institute for Theoretical Physics}, + address = {ETH Zurich}, + year = {2004} +} + + +@Article{ryabko2004, + author = {B.Y. Ryabko and V.S. Stognienko and Yu.I. Shokin}, + title = {A new test for randomness and its application to some cryptographic problems}, + journal = {Journal of Statistical Planning and Inference}, + volume = {123}, + pages = {365--376}, + year = {2004} +} + + +@Article{ryabko2005, + author = {B.Y. Ryabko and V.A. Monarev}, + title = {Using information theory approach to randomness testing}, + journal = {Journal of Statistical Planning and Inference}, + volume = {133}, + pages = {95--110}, + year = {2005} +} + +@MISC{ryabko2006, + Author = {S. Doroshenko and B. Ryabko}, + Howpublished = {Cryptology ePrint Archive, Report 2006/070}, + Note = {\url{http://eprint.iacr.org/}}, + Title = {The experimental distinguishing attack on RC4}, + Year = {2006} +} +%Date-Added = {2015-12-10 12:44:13 +0000}, +%Date-Modified = {2015-12-10 13:31:48 +0000}, + +@MISC{ryabko2006_2, + Author = {S. Doroshenko and A. Fionov and A. Lubkin and V. Monarev and B. Ryabko}, + Howpublished = {Cryptology ePrint Archive, Report 2006/196}, + Note = {\url{http://eprint.iacr.org/}}, + Title = {On ZK-Crypt, Book Stack, and Statistical Tests}, + Year = {2006} +} +%Date-Added = {2015-12-10 12:44:45 +0000}, +% Date-Modified = {2015-12-10 12:46:49 +0000}, + +@MISC{ent, + author = {J. Walker}, + title = {ENT - A pseudorandom number sequence test program}, + howpublished = {\url{https://www.fourmilab.ch/random/}}, + note = "[Online; accessed 25-February-2014]", + year= {2014} +} + + +@inproceedings{sys14, + author = {M. S\'{y}s and P. \v{S}venda and M. Ukrop and V. Maty\'{a}\v{s}}, + address = {Portugal}, + booktitle = {SECRYPT 2014 Proceedings of the 11th International Conference on Security and Cryptography}, + editor = {Mohammad S. Obaidat, Andreas Holzinger and Pierangela Samarati}, + keywords = {eSTREAM;Genetic Programming; Random Distinguisher; Randomness Statistical Testing; Software Circuit}, + howpublished = {pametovy nosic}, + language = {eng}, + location = {Portugal}, + isbn = {978-989-758-045-1}, + pages = {229-237}, + publisher = {SCITEPRESS-Science and Technology Publications}, + title = {Constructing empirical tests of randomness}, + year = {2014} +} + +@inproceedings{sys14_2, + author = {M. S\'{y}s and Z. \v{R}\'{i}ha}, + address = {Portugal}, + booktitle = {Security, Privacy, and Applied Cryptography Engineering Lecture Notes in Computer Science}, + editor = {Chakraborty R.S. et al.}, + language = {eng}, + location = {Switzerland}, + pages = {272--284}, + publisher = {Springer}, + title = {Faster randomness testing with the NIST statistical test suite}, + year = {2014} +} + + +@inproceedings{jang06, + author = {I. Jang and H.S. Yoo}, + address = {}, + booktitle = {Computational Science and Its Applications - ICCSA 2006, Part II}, + editor = {Gervasi, O., Kumar, V., Tan, C.J.K., Taniar, D., Lagana, A., Mun, Y., Choo, H.}, + keywords = {}, + howpublished = {}, + language = {eng}, + location = {Heidelberg}, + isbn = {978-3-540-34074-4}, + pages = {206-212}, + publisher = {Springer-Verlag}, + title = {Pseudorandom Number Generators Using Optimal Normal Basis}, + year = {2006} +}%https://books.google.com.tr/books?id=sNU_IjySzXcC&pg=PA212&dq=tests+of+ENT+test+battery+randomness&hl=tr&sa=X&ei=jvSPVImGJNjzapemgKgD&ved=0CCsQ6AEwAQ#v=onepage&q=tests%20of%20ENT%20test%20battery%20randomness&f=false + +@inproceedings{soto99, + author = {J. Soto}, + address = {USA}, + booktitle = {Proceedings of the 22nd National Information Systems Security Conference}, + editor = {}, + keywords = {}, + howpublished = {}, + language = {eng}, + location = {Virginia, USA}, + isbn = {}, + pages = {}, + publisher = {National Institute of Standards and Technology}, + title = {Statistical Testing of Random Number Generators}, + year = {1999} +} + +@ARTICLE{sadique, + author = {J.K.M. Sadique and U. Zaman and R. Ghosh}, + title = {Review on fifteen Statistical Tests proposed by NIST}, + journal = {Journal of Theoretical Physics and Cryptography}, + year = {2012}, + volume = {1}, + pages = {18-31}, + month = {November} +} + +@ARTICLE{nuzzo, + author = {R. Nuzzo}, + title = {Scientific method: Statistical errors}, + journal = {Nature}, + year = {2014}, + volume = {506}, + number = {7487}, + pages = {150} +} %http://www.nature.com/news/scientific-method-statistical-errors-1.14700 + + +@ARTICLE{vattulainen, + author = {I. Vattulainen and T. Ala-Nissila and K. Kankaala}, + title = {Physical models as tests of randomness}, + journal = {Physical Review Engineering}, + year = {1995}, + volume = {52}, + pages = {3205--3213}, + month = {} +}