Software Open Access

A Verified Implementation of the Berlekamp–Zassenhaus Factorization Algorithm, supporting material

Divasón, Jose; Joosten, Sebastiaan J. C.; Thiemann, René; Yamada, Akihisa

This is the supporting material for the paper A Verified Implementation of the Berlekamp–Zassenhaus Factorization Algorithm by Jose Divasón, Sebastiaan Joosten, René Thiemann and Akihisa Yamada.


We formalize the Berlekamp--Zassenhaus algorithm for factoring square-free integer polynomials in Isabelle/HOL. We further adapt an existing formalization of Yun's square-free factorization algorithm to integer polynomials, and thus provide an efficient and certified factorization algorithm for arbitrary univariate polynomials.

The algorithm first performs factorization in the prime field GF(p) and then performs computations in the ring of integers modulo pk, where both p and k are determined at runtime. Since a natural modeling of these structures via dependent types is not possible in Isabelle/HOL, we formalize the whole algorithm using locales and local type definitions.

Through experiments we verify that our algorithm factors polynomials of degree up to 500 within seconds.


The formalization is part of the Archive of Formal Proofs for Isabelle 2019 within the entry The Factorization Algorithm of Berlekamp and Zassenhaus.

The following list documents the relationship between the paper and the formalization:

Section 1 Introduction

Section 3 Formalizing Prime Fields

Section 4 Square-Free Factorization of Integer Polynomials

Section 5 Square-Free Polynomials in GF(p)

Section 6 Berlekamp's Algorithm

Section 7 Mignotte's Factor Bound

Section 8 Hensel Lifting

Section 9 Reconstructing True Factors

Section 10 Assembled Factorization Algorithm


One can rerun the experiments as follows:

  1. Download and extract the attached file.
  2. Inspect the path of the constant binary within the file experiments/Code_Old/Mathematica.hs whether it matches your Mathematica installation. Otherwise you can deactivate the Mathematica experiments by disabling the external factorization in experiments/Experiments/
  3. Compile experiments/Code_Old/Main and experiments/Code_New/Main with -O2
  4. Invoke ./experiments/Experiments/
  5. To turn the raw data into .csv-files and generated the Mathematica-graph, change to the experiments/Experiments directory and invoke ./
  6. To get the pdf-file, paste the output of the previous command into the first line of the Mathematica-file journal_plot.nb

One can also run the experiments disabling some of the optimizations by means of the files Code_New_No_{...}/Main.hs

In addition, the Isabelle file Generate_Code.thy generates the Haskell sources.

The following table contains all the experiments of Figure 1 in the article.

Polynomial      Mathematica      Old         New   
poly_100.poly         0.478s         0.194s     0.085s
poly_101.poly         0.449s         0.209s     0.095s
poly_102.poly         0.475s         0.247s     0.145s
poly_103.poly         0.491s         0.171s     0.109s
poly_104.poly         0.479s         0.131s     0.096s
poly_105.poly         0.492s         0.276s     0.140s
poly_106.poly         0.458s         0.148s     0.097s
poly_107.poly         0.463s         0.180s     0.107s
poly_108.poly         0.472s         0.216s     0.122s
poly_109.poly         0.477s         0.154s     0.103s
poly_110.poly         0.457s         0.180s     0.119s
poly_111.poly         0.465s         0.218s     0.122s
poly_112.poly         0.487s         0.217s     0.132s
poly_113.poly         0.471s         0.130s     0.084s
poly_114.poly         0.465s         0.269s     0.120s
poly_115.poly         0.464s         0.243s     0.105s
poly_116.poly         0.457s         0.269s     0.122s
poly_117.poly         0.476s         0.333s     0.135s
poly_118.poly         0.498s         0.220s     0.082s
poly_119.poly         0.462s         0.228s     0.134s
poly_120.poly         0.449s         0.318s     0.109s
poly_121.poly         0.485s         0.271s     0.181s
poly_122.poly         0.483s         0.229s     0.108s
poly_123.poly         0.465s         0.254s     0.147s
poly_124.poly         0.495s         0.278s     0.158s
poly_125.poly         0.460s         0.378s     0.157s
poly_126.poly         0.480s         0.306s     0.168s
poly_127.poly         0.476s         0.328s     0.198s
poly_128.poly         0.492s         0.272s     0.144s
poly_129.poly         0.464s         0.421s     0.226s
poly_130.poly         0.483s         0.267s     0.132s
poly_131.poly         0.497s         0.329s     0.158s
poly_132.poly         0.471s         0.482s     0.241s
poly_133.poly         0.493s         0.448s     0.294s
poly_134.poly         0.474s         0.317s     0.172s
poly_135.poly         0.507s         0.408s     0.170s
poly_136.poly         0.502s         0.429s     0.242s
poly_137.poly         0.499s         0.279s     0.171s
poly_138.poly         0.480s         0.326s     0.195s
poly_139.poly         0.499s         0.327s     0.157s
poly_140.poly         0.481s         0.390s     0.245s
poly_141.poly         0.516s         0.412s     0.249s
poly_142.poly         0.496s         0.295s     0.192s
poly_143.poly         0.500s         0.280s     0.185s
poly_144.poly         0.525s         0.513s     0.268s
poly_145.poly         0.518s         0.424s     0.257s
poly_146.poly         0.492s         0.478s     0.209s
poly_147.poly         0.474s         0.595s     0.296s
poly_148.poly         0.483s         0.379s     0.209s
poly_149.poly         0.483s         0.542s     0.296s
poly_150.poly         0.493s         0.224s     0.131s
poly_151.poly         0.484s         0.533s     0.232s
poly_152.poly         0.537s         0.473s     0.183s
poly_153.poly         0.513s         0.500s     0.301s
poly_154.poly         0.487s         0.357s     0.183s
poly_155.poly         0.544s         0.659s     0.294s
poly_156.poly         0.497s         0.627s     0.221s
poly_157.poly         0.491s         0.706s     0.390s
poly_158.poly         0.538s         0.473s     0.208s
poly_159.poly         0.487s         0.920s     0.470s
poly_160.poly         0.544s         0.665s     0.249s
poly_161.poly         0.515s         0.605s     0.207s
poly_162.poly         0.509s         1.037s     0.384s
poly_163.poly         0.493s         0.622s     0.294s
poly_164.poly         0.498s         0.441s     0.269s
poly_165.poly         0.487s         0.889s     0.432s
poly_166.poly         0.561s         0.578s     0.299s
poly_167.poly         0.531s         0.905s     0.236s
poly_168.poly         0.504s         0.834s     0.318s
poly_169.poly         0.533s         1.177s     0.347s
poly_170.poly         0.534s         0.743s     0.271s
poly_171.poly         0.509s         0.718s     0.393s
poly_172.poly         0.590s         0.703s     0.342s
poly_173.poly         0.488s         0.828s     0.259s
poly_174.poly         0.526s         0.711s     0.346s
poly_175.poly         0.522s         0.722s     0.428s
poly_176.poly         0.559s         0.722s     0.295s
poly_177.poly         0.521s         1.151s     0.320s
poly_178.poly         0.504s         0.816s     0.333s
poly_179.poly         0.535s         1.206s     0.629s
poly_180.poly         0.495s         0.707s     0.293s
poly_181.poly         0.478s         0.948s     0.331s
poly_182.poly         0.537s         1.259s     0.435s
poly_183.poly         0.519s         0.863s     0.390s
poly_184.poly         0.550s         1.716s     0.669s
poly_185.poly         0.507s         1.166s     0.320s
poly_186.poly         0.556s         1.187s     0.508s
poly_187.poly         0.547s         1.070s     0.654s
poly_188.poly         0.529s         0.979s     0.354s
poly_189.poly         1.232s         1.565s     0.578s
poly_190.poly         0.578s         1.383s     0.407s
poly_191.poly         0.521s         1.093s     0.417s
poly_192.poly         0.510s         1.031s     0.393s
poly_193.poly         0.623s         0.886s     0.524s
poly_194.poly         0.548s         1.434s     0.562s
poly_195.poly         0.525s         1.580s     0.336s
poly_196.poly         0.567s         1.640s     0.647s
poly_197.poly         0.543s         1.223s     0.593s
poly_198.poly         0.569s         1.351s     0.732s
poly_199.poly         0.547s         1.096s     0.469s
poly_200.poly         0.507s         1.449s     0.729s
poly_201.poly         0.643s         1.653s     0.594s
poly_202.poly         0.550s         1.233s     0.361s
poly_203.poly         0.612s         1.274s     0.651s
poly_204.poly         0.538s         1.064s     0.595s
poly_205.poly         0.628s         1.539s     0.767s
poly_206.poly         0.587s         1.217s     0.486s
poly_207.poly         0.496s         1.833s     0.533s
poly_208.poly         0.565s         1.547s     0.370s
poly_209.poly         0.557s         1.796s     0.805s
poly_210.poly         0.507s         1.988s     0.504s
poly_211.poly         0.710s         1.440s     0.661s
poly_212.poly         0.567s         1.301s     0.443s
poly_213.poly         0.535s         1.277s     0.463s
poly_214.poly         0.562s         1.963s     0.769s
poly_215.poly         0.607s         1.809s     0.695s
poly_216.poly         0.556s         1.627s     0.835s
poly_217.poly         0.583s         2.044s     0.837s
poly_218.poly         0.622s         2.638s     0.571s
poly_219.poly         0.618s         1.851s     0.755s
poly_220.poly         0.549s         2.227s     0.605s
poly_221.poly         0.562s         1.441s     0.725s
poly_222.poly         0.519s         1.129s     0.595s
poly_223.poly         0.538s         2.158s     0.863s
poly_224.poly         0.542s         1.832s     0.646s
poly_225.poly         0.533s         3.330s     0.928s
poly_226.poly         0.635s         1.760s     0.953s
poly_227.poly         0.560s         1.580s     0.460s
poly_228.poly         0.609s         2.838s     1.023s
poly_229.poly         0.636s         1.961s     0.860s
poly_230.poly         0.643s         1.743s     0.459s
poly_231.poly         0.756s         2.141s     0.722s
poly_232.poly         0.553s         2.869s     1.206s
poly_233.poly         0.627s         1.933s     0.755s
poly_234.poly         0.567s         3.316s     0.435s
poly_235.poly         0.633s         2.612s     0.758s
poly_236.poly         0.542s         1.896s     0.490s
poly_237.poly         0.693s         3.163s     0.729s
poly_238.poly         0.647s         1.464s     0.699s
poly_239.poly         0.555s         1.564s     0.658s
poly_240.poly         0.567s         2.361s     0.793s
poly_241.poly         0.640s         3.208s     0.607s
poly_242.poly         0.780s         2.006s     0.876s
poly_243.poly         0.556s         2.465s     0.973s
poly_244.poly         0.694s         2.305s     1.191s
poly_245.poly         0.588s         2.651s     0.525s
poly_246.poly         0.588s         3.791s     0.973s
poly_247.poly         0.684s         3.583s     0.820s
poly_248.poly         0.626s         3.027s     1.153s
poly_249.poly         0.540s         1.997s     0.647s
poly_250.poly         0.614s         2.558s     1.139s
poly_251.poly         0.663s         2.376s     1.259s
poly_252.poly         0.655s         2.551s     0.952s
poly_253.poly         0.685s         3.436s     0.999s
poly_254.poly         0.727s         3.217s     1.133s
poly_255.poly         0.831s         2.706s     0.923s
poly_256.poly         0.730s         3.011s     1.385s
poly_257.poly         0.605s         2.808s     1.121s
poly_258.poly         0.609s         2.056s     0.825s
poly_259.poly         0.740s         3.579s     1.263s
poly_260.poly         0.655s         3.068s     1.411s
poly_261.poly         0.647s         2.959s     1.240s
poly_262.poly         0.574s         3.489s     1.158s
poly_263.poly         0.757s         3.162s     1.207s
poly_264.poly         0.710s         3.118s     1.047s
poly_265.poly         0.728s         3.967s     1.332s
poly_266.poly         0.765s         3.685s     1.115s
poly_267.poly         0.592s         4.304s     1.330s
poly_268.poly         0.717s         3.360s     1.578s
poly_269.poly         0.885s         4.903s     0.857s
poly_270.poly         0.953s         3.333s     1.233s
poly_271.poly         0.817s         3.409s     0.753s
poly_272.poly         0.776s         3.498s     1.303s
poly_273.poly         0.707s         4.628s     0.852s
poly_274.poly         0.689s         5.255s     1.282s
poly_275.poly         0.892s         5.099s     0.855s
poly_276.poly         0.567s         4.737s     1.194s
poly_277.poly         0.873s         4.736s     0.962s
poly_278.poly         0.766s         3.295s     1.257s
poly_279.poly         0.969s         2.762s     0.942s
poly_280.poly         0.732s         4.787s     0.891s
poly_281.poly         0.732s         4.608s     1.302s
poly_282.poly         0.871s         5.127s     0.782s
poly_283.poly         0.738s         3.931s     1.004s
poly_284.poly         0.857s         4.326s     1.888s
poly_285.poly         0.646s         5.082s     1.506s
poly_286.poly         0.815s         4.132s     1.396s
poly_287.poly         0.965s         4.368s     1.355s
poly_288.poly         0.746s         4.417s     1.476s
poly_289.poly         0.764s         6.243s     1.312s
poly_290.poly         0.610s         3.899s     0.984s
poly_291.poly         0.680s         5.110s     0.958s
poly_292.poly         0.717s         5.487s     0.880s
poly_293.poly         0.717s         8.597s     1.738s
poly_294.poly         0.721s         6.355s     2.375s
poly_295.poly         0.987s         3.809s     1.191s
poly_296.poly         0.876s         5.080s     2.065s
poly_297.poly         0.882s         5.162s     1.925s
poly_298.poly         1.053s         6.622s     1.675s
poly_299.poly         0.787s         4.366s     1.351s
poly_300.poly         0.878s         7.252s     1.340s
poly_301.poly         0.718s         5.359s     0.977s
poly_302.poly         1.076s         5.446s     1.446s
poly_303.poly         1.355s         3.074s     1.388s
poly_304.poly         0.710s         7.352s     1.100s
poly_305.poly         0.862s         5.038s     1.036s
poly_306.poly         0.640s         5.466s     2.315s
poly_307.poly         0.907s         6.191s     2.003s
poly_308.poly         0.825s         4.889s     1.787s
poly_309.poly         1.157s         4.730s     1.683s
poly_310.poly         1.048s         6.380s     1.899s
poly_311.poly         0.821s         5.340s     1.493s
poly_312.poly         0.734s         4.584s     1.257s
poly_313.poly         0.875s         5.126s     1.942s
poly_314.poly         1.152s         6.076s     1.132s
poly_315.poly         0.646s         8.902s     2.290s
poly_316.poly         0.864s         7.926s     1.816s
poly_317.poly         0.865s         5.540s     2.609s
poly_318.poly         1.217s         8.536s     2.028s
poly_319.poly         0.787s         6.662s     2.033s
poly_320.poly         1.368s         5.776s     1.548s
poly_321.poly         0.984s         8.860s     2.601s
poly_322.poly         0.869s         9.124s     1.810s
poly_323.poly         0.648s         6.936s     1.108s
poly_324.poly         0.937s         7.901s     1.841s
poly_325.poly         0.901s         6.507s     2.776s
poly_326.poly         0.733s         6.871s     1.727s
poly_327.poly         0.765s         8.104s     2.637s
poly_328.poly         0.885s        10.401s    2.218s
poly_329.poly         1.001s         4.122s     1.249s
poly_330.poly         0.785s         6.544s     1.827s
poly_331.poly         0.918s         9.594s     1.460s
poly_332.poly         0.843s         7.225s     3.023s
poly_333.poly         1.150s        11.494s    2.873s
poly_334.poly         0.950s        10.194s    2.355s
poly_335.poly         1.172s         8.722s     2.315s
poly_336.poly         1.027s         6.473s     1.449s
poly_337.poly         0.751s        11.346s    1.752s
poly_338.poly         0.813s         9.438s     1.968s
poly_339.poly         0.815s         7.378s     2.027s
poly_340.poly         0.664s         8.289s     1.205s
poly_341.poly         0.919s         6.848s     2.083s
poly_342.poly         1.027s        14.903s    1.691s
poly_343.poly         1.158s         9.495s     2.103s
poly_344.poly         0.812s         9.516s     3.305s
poly_345.poly         1.189s         5.334s     2.104s
poly_346.poly         1.014s        10.649s    3.294s
poly_347.poly         0.975s         8.088s     1.566s
poly_348.poly         0.877s        10.249s    2.408s
poly_349.poly         0.850s        13.374s    3.216s
poly_350.poly         1.246s        11.256s    2.747s
poly_351.poly         0.959s         8.027s     2.336s
poly_352.poly         1.013s         9.565s     2.848s
poly_353.poly         0.764s         9.335s     1.650s
poly_354.poly         1.242s         9.831s     2.840s
poly_355.poly         1.636s         7.602s     2.256s
poly_356.poly         1.080s         8.711s     3.033s
poly_357.poly         0.776s        10.423s    3.029s
poly_358.poly         0.909s        12.636s    3.057s
poly_359.poly         0.894s        15.462s    3.104s
poly_360.poly         1.062s        12.932s    3.219s
poly_361.poly         0.964s        15.856s    2.869s
poly_362.poly         0.863s        10.977s    4.597s
poly_363.poly         1.288s        21.610s    2.335s
poly_364.poly         0.895s        17.265s    1.675s
poly_365.poly         0.979s         9.957s     2.394s
poly_366.poly         1.727s         8.259s     3.021s
poly_367.poly         0.977s        10.959s    4.299s
poly_368.poly         1.248s        15.490s    3.341s
poly_369.poly         0.791s        12.137s    3.151s
poly_370.poly         0.754s        13.471s    1.879s
poly_371.poly         1.289s        12.679s    2.693s
poly_372.poly         0.856s         6.906s     1.488s
poly_373.poly         1.442s         9.346s     3.019s
poly_374.poly         0.961s        13.392s    3.527s
poly_375.poly         0.982s         9.665s     2.495s
poly_376.poly         1.431s         8.820s     2.613s
poly_377.poly         1.262s        10.092s    2.358s
poly_378.poly         1.067s        13.103s    4.017s
poly_379.poly         0.798s        11.407s    2.530s
poly_380.poly         1.381s        12.311s    2.954s
poly_381.poly         1.278s         8.984s     1.999s
poly_382.poly         0.895s         9.518s     2.817s
poly_383.poly         0.945s        13.615s    3.512s
poly_384.poly         1.031s        19.243s    3.481s
poly_385.poly         1.046s        13.784s    2.661s
poly_386.poly         1.275s        10.230s    3.170s
poly_387.poly         0.976s        13.687s    3.704s
poly_388.poly         0.733s         8.044s     1.772s
poly_389.poly         0.902s         9.925s     2.886s
poly_390.poly         0.766s         8.027s     1.704s
poly_391.poly         0.774s        19.267s    3.956s
poly_392.poly         1.368s        17.336s    2.238s
poly_393.poly         1.079s        11.014s    3.572s
poly_394.poly         0.971s        14.128s    4.558s
poly_395.poly         1.163s        12.663s    2.931s
poly_396.poly         0.984s        13.827s    2.365s
poly_397.poly         1.796s        14.465s    4.155s
poly_398.poly         0.899s        13.236s    1.938s
poly_399.poly         1.339s        20.634s    4.699s
poly_400.poly         1.162s        13.476s    1.849s
poly_401.poly         1.086s         8.101s     2.171s
poly_402.poly         1.891s        11.124s    3.086s
poly_403.poly         0.988s        11.010s    2.644s
poly_404.poly         1.051s        20.160s    2.425s
poly_405.poly         1.647s        23.650s    5.199s
poly_406.poly         1.036s        15.906s    4.767s
poly_407.poly         1.083s        16.742s    2.401s
poly_408.poly         1.177s        19.860s    3.804s
poly_409.poly         1.107s        12.738s    3.757s
poly_410.poly         1.193s        11.465s    3.740s
poly_411.poly         1.550s        16.718s    3.228s
poly_412.poly         1.252s        23.868s    4.908s
poly_413.poly         0.895s        14.672s    2.091s
poly_414.poly         1.146s        20.009s    4.559s
poly_415.poly         1.152s        30.237s    3.488s
poly_416.poly         1.262s        15.382s    3.950s
poly_417.poly         1.472s        17.767s    3.577s
poly_418.poly         1.928s        13.745s    2.527s
poly_419.poly         1.431s        18.499s    3.931s
poly_420.poly         1.035s        12.498s    4.095s
poly_421.poly         2.506s        20.517s    3.537s
poly_422.poly         1.489s        24.745s    4.400s
poly_423.poly         1.250s        22.582s    6.671s
poly_424.poly         0.972s        14.030s    2.653s
poly_425.poly         1.212s        18.464s    5.370s
poly_426.poly         0.962s        14.179s    2.795s
poly_427.poly         1.252s        19.630s    5.115s
poly_428.poly         1.220s        27.196s    6.014s
poly_429.poly         1.027s        19.862s    5.965s
poly_430.poly         1.201s        23.786s    5.561s
poly_431.poly         1.734s        18.729s    2.498s
poly_432.poly         1.238s        28.353s    4.299s
poly_433.poly         1.174s        14.652s    2.770s
poly_434.poly         1.760s        20.187s    6.655s
poly_435.poly         1.538s        11.108s    2.718s
poly_436.poly         1.594s        14.872s    3.205s
poly_437.poly         1.147s        14.635s    3.155s
poly_438.poly         1.690s        20.034s    3.980s
poly_439.poly         1.411s        25.149s    2.364s
poly_440.poly         1.163s        25.878s    4.781s
poly_441.poly         1.384s        25.170s    5.160s
poly_442.poly         0.870s        11.668s    2.323s
poly_443.poly         0.951s        33.579s    6.205s
poly_444.poly         1.065s        17.941s    2.910s
poly_445.poly         1.998s        16.430s    3.563s
poly_446.poly         1.045s        26.910s    4.228s
poly_447.poly         1.295s        29.425s    5.399s
poly_448.poly         1.661s        16.258s    2.585s
poly_449.poly         1.622s        17.693s    4.303s
poly_450.poly         1.641s        22.936s    6.282s
poly_451.poly         1.703s        22.255s    4.342s
poly_452.poly         1.430s        31.131s    4.344s
poly_453.poly         1.971s        21.473s    4.852s
poly_454.poly         1.567s        37.292s    6.394s
poly_455.poly         1.935s        30.081s    4.497s
poly_456.poly         1.516s        22.825s    6.350s
poly_457.poly         0.990s        22.727s    5.842s
poly_458.poly         2.405s        27.059s    5.239s
poly_459.poly         2.000s        29.375s    3.965s
poly_460.poly         1.269s        21.120s    4.921s
poly_461.poly         1.220s        18.023s    3.005s
poly_462.poly         1.530s        30.173s    5.349s
poly_463.poly         1.502s        35.296s    4.015s
poly_464.poly         2.152s        27.638s    4.711s
poly_465.poly         1.497s        33.634s    6.219s
poly_466.poly         1.395s        31.657s    5.550s
poly_467.poly         1.275s        28.666s    4.809s
poly_468.poly         2.117s        16.743s    3.226s
poly_469.poly         2.483s        34.383s    5.065s
poly_470.poly         2.317s        17.479s    5.529s
poly_471.poly         1.959s        22.467s    7.354s
poly_472.poly         2.504s        23.219s    3.251s
poly_473.poly         3.680s        35.369s    7.189s
poly_474.poly         1.325s        33.530s    5.067s
poly_475.poly         1.061s        26.542s    5.007s
poly_476.poly         1.638s        24.279s    3.182s
poly_477.poly         1.551s        23.888s    7.094s
poly_478.poly         1.480s        30.671s    5.880s
poly_479.poly         1.545s        30.107s    8.659s
poly_480.poly         1.674s        34.370s    7.401s
poly_481.poly         2.276s        29.611s    5.249s
poly_482.poly         2.612s        26.880s    7.500s
poly_483.poly         2.534s        19.501s    3.872s
poly_484.poly         2.033s        45.472s    5.112s
poly_485.poly         2.442s        32.935s    6.633s
poly_486.poly         1.616s        30.956s    6.961s
poly_487.poly         1.807s        28.656s    3.263s
poly_488.poly         1.165s        41.173s    5.497s
poly_489.poly         1.978s        40.021s    4.627s
poly_490.poly         1.133s        37.273s    5.103s
poly_491.poly         2.112s        36.685s    7.104s
poly_492.poly         2.086s        30.427s    7.117s
poly_493.poly         1.297s        46.938s    6.873s
poly_494.poly         1.755s        34.678s    5.329s
poly_495.poly         2.274s        31.758s    6.371s
poly_496.poly         2.010s        34.106s    9.385s
poly_497.poly         2.014s        39.699s    5.630s
poly_498.poly         1.945s        38.142s    3.470s
poly_499.poly         1.622s        38.871s    5.723s

Files (566.4 kB)
Name Size
566.4 kB Download
All versions This version
Views 474135
Downloads 7833
Data volume 380.9 MB18.7 MB
Unique views 357115
Unique downloads 7131


Cite as