diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f7f54b4e2a928feb59ddc3064342163380ac64d7..6df84ed04a3da35eba2d8cdd5c66e196e74d7ece 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,14 +5,13 @@ pages: - pandoc --version # - pandoc --help # - pandoc --list-input-formats # Broken as pandoc dates from 2013 on this image! :( + - bin/pandoc_fixer.pl html_src_files.lst; - for file in `cat html_src_files.lst | sed 's/#.*//g' `; do - bin/pandoc_fixer.pl ${file}; - echo "Creating" public/`dirname ${file}`; mkdir -p public/`dirname ${file}`; mv ${file%.*}.html public/`dirname ${file}`/; done - - cat html_src_files.lst | sed -e 's|\.md |.html |' -e 's|\.org |\.html |' -e 's|^./\([^ ]*\) *# *\([^ ]*\)|- [[./\1]] (\2)|' > index.org - - pandoc -s -f org -t html -o public/index.html index.org + - cd module2/ressources/; tar zcf rr_org_archive.tgz rr_org/init.el rr_org/journal.org rr_org/init.org ; cd ../.. ; mv module2/ressources/rr_org_archive.tgz public/module2/ressources/ + - cd module2/ressources/; make -C replicable_article/ all ../replicable_article.tgz ; cd ../.. ; mv module2/ressources/replicable_article.tgz public/module2/ressources/ artifacts: paths: - public diff --git a/bin/pandoc_fixer.pl b/bin/pandoc_fixer.pl index d8c631bb821f6f063b5d2491a5f5caea1d57990a..810de0fd023e654de1c5bcb7a93ab519b1bd931e 100755 --- a/bin/pandoc_fixer.pl +++ b/bin/pandoc_fixer.pl @@ -1,93 +1,128 @@ #!/usr/bin/perl -w use strict; -my($usage) = "Usage: pandox_fixer.pl input.md"; +my($usage) = "Usage: pandox_fixer.pl org_md_files.lst"; ($#ARGV==0) or die $usage; -my($input)=shift(@ARGV); - -########### Git date ################# -my($gitdate)=`git log --date=short $input | grep Date | head -n 1`; -chomp($gitdate); -$gitdate =~ s/Date: *//g; -$gitdate =~ s/\s*\+.*$//g; - -########### Input file ############### -my($type) = ""; -my($output) = $input; -if($input =~ /.md$/) { - $type = "gfm"; - $output =~ s/.md$/.html/; -} elsif ($input =~ /.org$/) { - $type = "org"; - $output =~ s/.org$/.html/; -} else { - die "Usage: pandox_fixer.pl input.md"; -} -my($output_temp) = $output."tmp"; - -########### URL Fixing ############### - -my($input_path)=$input; -$input_path =~ s|/[^/]*$||g; -my($raw_path) = "https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/raw/master/".$input_path; -my($raw_path_percent) = $raw_path; $raw_path_percent =~ s/^http/%/g; -my($tree_path) = "https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/tree/master/".$input_path; -my($gitlab_origin)= "https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/blob/master/"; - -########### Pandoc ################# - -print "Exporting $input\n"; -my($pandoc_output) = `LANG=C ; pandoc -s --mathjax -f $type -t html -o $output_temp $input`;open INPUT, $output_temp or die; -open OUTPUT, "> ".$output or die; - - -while(defined(my $line=)) { - if($line =~ /

.*broken-links:nil/) { next; } - -# $line =~ s|https://gitlab.inria.fr/learninglab/|https://learninglab.gitlabpages.inria.fr/|g; ## Not such a good idea! - if($line =~ //) { - if($output=~ /_fr.html/) { - $line =~ s||Les sources de ce document sont disponibles sur gitlab.|g; - $line .= "
Version du $gitdate.


\n" - } else { - $line =~ s||The source of this document is available on gitlab.|g; - $line .= "
Last version: $gitdate

\n" - } +sub pandoc_export { + my($input)=shift(@_); + ########### Git date ################# + my($gitdate)=`git log --date=short $input | grep Date | head -n 1`; + chomp($gitdate); + $gitdate =~ s/Date: *//g; + $gitdate =~ s/\s*\+.*$//g; + + ########### Input file ############### + my($type) = ""; + my($output) = $input; + if($input =~ /.md$/) { + $type = "gfm"; + $output =~ s/.md$/.html/; + } elsif ($input =~ /.org$/) { + $type = "org"; + $output =~ s/.org$/.html/; + } else { + die "Usage: pandox_fixer.pl input.md"; } - $line =~ s|TOC||g; + my($output_temp) = $output."tmp"; + + ########### URL Fixing ############### + + my($input_path)=$input; + $input_path =~ s|/[^/]*$||g; + my($raw_path) = "https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/raw/master/".$input_path; + my($raw_path_percent) = $raw_path; $raw_path_percent =~ s/^http/%/g; + my($tree_path) = "https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/tree/master/".$input_path; + my($pages_path) = "https://learninglab.gitlabpages.inria.fr/mooc-rr/mooc-rr-ressources/".$input_path; + my($pages_path_percent) = $pages_path; $pages_path_percent =~ s/^http/%/g; + my($gitlab_origin)= "https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/blob/master/"; + + ########### Pandoc ################# + + print "Exporting $input\n"; + my($pandoc_output) = `LANG=C ; pandoc -s --mathjax -f $type -t html -o $output_temp $input`;open INPUT, $output_temp or die; + open OUTPUT, "> ".$output or die; + + + while(defined(my $line=)) { + if($line =~ /

.*broken-links:nil/) { next; } + + # $line =~ s|https://gitlab.inria.fr/learninglab/|https://learninglab.gitlabpages.inria.fr/|g; ## Not such a good idea! + if($line =~ //) { + if($output=~ /_fr.html/) { + $line =~ s||Les sources de ce document sont disponibles sur gitlab.|g; + $line .= "
Version du $gitdate.


\n" + } else { + $line =~ s||The source of this document is available on gitlab.|g; + $line .= "
Last version: $gitdate

\n" + } + } + $line =~ s|TOC||g; + + $line =~ s|---

|
|g; + # $line =~ s|Date:.*Date: $gitdateTITLE:\(.*\)TITLE:$1|
|g; - # $line =~ s|Date:.*Date: $gitdateTITLE:\(.*\)TITLE:$1 public/index.org" or die; + my($f); + print INDEX "| Gitlab Origin | Pandoc HTML (Gitlab pages) | FUN Outcome | +|---+---+---|\n"; + + while(defined($f = )) { + chomp($f); + if($f =~ /^\s*$/) { + print INDEX "|---+---+---|\n"; + next; + } + my($file,$url) = split(/\s*#\s*/,$f); + if($file eq "" || !defined($url)) { warn "Malformed line"; next;} + # print "'$file' --- '$url'\n"; +# pandoc_export($file); + + my($html)=$file; $html=~ s/\.[^\.]*$/.html/g; + my($url_id) = $url; $url_id =~ s|^.*jump_to_id/||g; + print INDEX "| [[https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/tree/master/$file][$file]] | [[$html]] | [[$url][$url_id]] |\n"; } - print OUTPUT $line; + print INDEX "|---+---+---|\n"; + close INDEX; + close LIST; + + my($pandoc_output) = `LANG=C ; pandoc -s -c http://www.pirilampo.org/styles/readtheorg/css/readtheorg.css -f org -t html -o public/index.html public/index.org`; } -close OUTPUT; -close INPUT; -unlink($output_temp); +main() diff --git a/gitlab-ci.org b/gitlab-ci.org index fc2acca0fa04701615a343909062191d85fc937c..e7fa1273a1ca1727b67302c52ad34af3a403c9e1 100644 --- a/gitlab-ci.org +++ b/gitlab-ci.org @@ -13,14 +13,13 @@ pages: - pandoc --version # - pandoc --help # - pandoc --list-input-formats # Broken as pandoc dates from 2013 on this image! :( + - bin/pandoc_fixer.pl html_src_files.lst; - for file in `cat html_src_files.lst | sed 's/#.*//g' `; do - bin/pandoc_fixer.pl ${file}; - echo "Creating" public/`dirname ${file}`; mkdir -p public/`dirname ${file}`; mv ${file%.*}.html public/`dirname ${file}`/; done - - cat html_src_files.lst | sed -e 's|\.md |.html |' -e 's|\.org |\.html |' -e 's|^./\([^ ]*\) *# *\([^ ]*\)|- [[./\1]] (\2)|' > index.org - - pandoc -s -f org -t html -o public/index.html index.org + - cd module2/ressources/; tar zcf rr_org_archive.tgz rr_org/init.el rr_org/journal.org rr_org/init.org ; cd ../.. ; mv module2/ressources/rr_org_archive.tgz public/module2/ressources/ + - cd module2/ressources/; make -C replicable_article/ all ../replicable_article.tgz ; cd ../.. ; mv module2/ressources/replicable_article.tgz public/module2/ressources/ artifacts: paths: - public @@ -115,115 +114,3 @@ chmod +x ./gitlab-ci.sh ./gitlab-ci.sh #+end_src -#+RESULTS: -#+begin_example -pandoc 2.2.1 -Compiled with pandoc-types 1.17.5.1, texmath 0.11.1, skylighting 0.7.5 -Default user data directory: /home/alegrand/.pandoc -Copyright (C) 2006-2018 John MacFarlane -Web: http://pandoc.org -This is free software; see the source for copying conditions. -There is no warranty, not even for merchantability or fitness -for a particular purpose. -Exporting ./module2/ressources/maintaining_a_journal.org -Creating public/./module2/ressources -Exporting ./module2/ressources/jupyter_fr.org -Creating public/./module2/ressources -Exporting ./module2/ressources/rstudio_fr.org -Creating public/./module2/ressources -Exporting ./module2/ressources/gitlab_fr.org -Creating public/./module2/ressources -Exporting ./module2/ressources/emacs_orgmode_fr.org -Creating public/./module2/ressources -Exporting ./module2/ressources/jupyter.org -Creating public/./module2/ressources -Exporting ./module2/ressources/emacs_orgmode.org -Creating public/./module2/ressources -Exporting ./module2/ressources/maintaining_a_journal_fr.org -Creating public/./module2/ressources -Exporting ./module2/ressources/rstudio.org -Creating public/./module2/ressources -Exporting ./module2/ressources/gitlab.org -Creating public/./module2/ressources -Exporting ./module2/ressources/orgmode_examples/README.org -Creating public/./module2/ressources/orgmode_examples -Exporting ./module2/ressources/orgmode_examples/README_fr.org -Creating public/./module2/ressources/orgmode_examples -Exporting ./module2/exo4/stat_activity.org -Creating public/./module2/exo4 -Exporting ./module2/slides/ressources_fr.org -Creating public/./module2/slides -Exporting ./module2/slides/ressources.org -Creating public/./module2/slides -Exporting ./module3/ressources/iso_date_format.org -Creating public/./module3/ressources -Exporting ./module3/ressources/iso_date_format_fr.org -Creating public/./module3/ressources -Exporting ./module3/ressources/influenza-like-illness-analysis-orgmode+R.org -Creating public/./module3/ressources -Exporting ./module3/ressources/influenza-like-illness-analysis-orgmode+Lisp+Python+R.org -Creating public/./module3/ressources -Exporting ./module3/ressources/influenza-like-illness-analysis-orgmode.org -Creating public/./module3/ressources -Exporting ./module3/ressources/analyse-syndrome-grippal-orgmode.org -Creating public/./module3/ressources -Exporting ./module3/ressources/analyse-syndrome-grippal-orgmode+R.org -Creating public/./module3/ressources -Exporting ./module3/ressources/analyse-syndrome-grippal-orgmode+Lisp+Python+R.org -Creating public/./module3/ressources -Exporting ./module1/ressources/Module1_1_MaterielSupplementaire_fr.org -Creating public/./module1/ressources -Exporting ./module1/ressources/Module1_2_MaterielSupplementaire_fr.org -Creating public/./module1/ressources -Exporting ./module1/ressources/Module1_3_MaterielSupplementaire_fr.org -Creating public/./module1/ressources -Exporting ./module1/ressources/Module1_5_MaterielSupplementaire_fr.org -Creating public/./module1/ressources -Exporting ./module1/ressources/Module1_1_SupplementaryMaterial.org -Creating public/./module1/ressources -Exporting ./module1/ressources/Module1_2_SupplementaryMaterial.org -Creating public/./module1/ressources -Exporting ./module1/ressources/introduction_to_markdown_fr.org -Creating public/./module1/ressources -Exporting ./module1/ressources/introduction_to_markdown.org -Creating public/./module1/ressources -Exporting ./module1/ressources/module1_supplementary_material.org -Creating public/./module1/ressources -Exporting ./module1/ressources/module1_additionalRessources.md -Creating public/./module1/ressources -Exporting ./module1/ressources/sequence3_fr.org -Creating public/./module1/ressources -Exporting ./module1/ressources/sequence5_fr.org -Creating public/./module1/ressources -Exporting ./module1/ressources/sequence2_fr.org -Creating public/./module1/ressources -Exporting ./module1/ressources/sequence1_fr.org -Creating public/./module1/ressources -Exporting ./module4/ressources/resources_refs.org -Creating public/./module4/ressources -Exporting ./module4/ressources/resources_refs_fr.org -Creating public/./module4/ressources -Exporting ./module4/ressources/exo1.org -Creating public/./module4/ressources -Exporting ./module4/ressources/exo2.org -Creating public/./module4/ressources -Exporting ./module4/ressources/exo3.org -Creating public/./module4/ressources -Exporting ./module4/ressources/resources_environment.org -Creating public/./module4/ressources -Exporting ./module4/ressources/resources_environment_fr.org -Creating public/./module4/ressources -Exporting ./documents/notebooks/notebook_RStudio_SASmarkdown.md -Creating public/./documents/notebooks -Exporting ./documents/tuto_git_gtlab/tuto_git_gitlab.md -Creating public/./documents/tuto_git_gtlab -Exporting ./documents/tuto_rstudio_gitlab/tuto_rstudio_gitlab.md -Creating public/./documents/tuto_rstudio_gitlab -Exporting ./documents/tuto_magit/tuto_magit.md -Creating public/./documents/tuto_magit -Exporting ./documents/tuto_emacs_windows/tuto_emacs_windows.md -Creating public/./documents/tuto_emacs_windows -Exporting ./documents/tuto_jupyter_windows/tuto_jupyter_windows.md -Creating public/./documents/tuto_jupyter_windows -#+end_example - diff --git a/module1/ressources/introduction_to_markdown.org b/module1/ressources/introduction_to_markdown.org index 5fd18a143905705f3f789f589e712db9209e127c..492238b91af6e4fbf15ba5285f8a489016c156c6 100644 --- a/module1/ressources/introduction_to_markdown.org +++ b/module1/ressources/introduction_to_markdown.org @@ -25,6 +25,7 @@ Archer Reilly]]. - [[#summations-and-integrals][Summations and integrals]] - [[#outfits][Outfits]] - [[#about-markdown][About =markdown=]] +- [[#markdown-and-pandoc-resources-in-english][Markdown/Pandoc Resources in english]] * Syntax ** Headers @@ -194,3 +195,18 @@ The =pdf= conversion always relies on [[https://fr.wikipedia.org/wiki/LaTeX][LaT In the demo, we show how to generate a =docx= from a =markdown= document with =Pandoc= and we explain that it is then possible to use a word processor like =LibreOffice= to edit the resulting file. Obviously the modifications will not be back-propagated to the original =markdown= document. You may however want to use =Pandoc= again to convert your new =docx= document to a new =markdown= document. Another common strategy consists in doing most of the editing of an article/report in =Markdown= and to export it into a =docx= (or =LaTeX=) only in the end so as to prepare it for a camera-ready version with a standard word processing environment (or a =LaTeX= editor). + +* Markdown and Pandoc Resources in english +** Mardown et pandoc +- [[https://programminghistorian.org/en/lessons/sustainable-authorship-in-plain-text-using-pandoc-and-markdown][Sustainable Authorship in Plain Text using Pandoc and Markdown by Dennis Tenen and Grant Wythoff]]: in this tutorial, you will first learn the basics of Markdown—an easy to read and write markup syntax for plain text—as well as Pandoc, a command line tool that converts plain text into a number of beautifully formatted file types: PDF, .docx, HTML, LaTeX, slide decks, and more. +- The « [[https://github.com/jgm/pandoc/wiki/Documentation-and-Tutorials][Documentation and Tutorials]] » page of the github Pandoc project provides many links to resources about Pandoc. + +** Markdown syntax +- [[https://programminghistorian.org/en/lessons/getting-started-with-markdown][Programming Historian : Getting Started with Markdown]] is very usefull to understand why this language is used, how to format Markdown files, and how to preview Markdown-formatted documents on the web (in spanish [[https://programminghistorian.org/es/lecciones/introduccion-a-markdown][Introducción a Markdown]]) +- To write equations with Markdown: [[http://pandoc.org/MANUAL.html#math][see the relevant part of the Pandoc documentation]] +- Writing equations requires a basic knowledge of TeX / LaTeX: [[https://en.wikibooks.org/wiki/LaTeX][see wikibooks.org documentation about LaTeX]] + +** Others + +The resources listed under the [[https://programminghistorian.org/en/lessons/?activity=sustaining][Sustain section of "The Programming Historian"]] are all relevant for Module 1 (in particular the tutorial on Git/GitHub). + diff --git a/module1/ressources/introduction_to_markdown_fr.org b/module1/ressources/introduction_to_markdown_fr.org index 8413fcba5f36713087d8ff611a6186df1c23530e..f2af3f757c8ff4ebee9cfa042512b3d152753c3d 100644 --- a/module1/ressources/introduction_to_markdown_fr.org +++ b/module1/ressources/introduction_to_markdown_fr.org @@ -26,6 +26,7 @@ Voici un aperçu rapide de la syntaxe Markdown repris d'une - [[#déguisements][Déguisements]] - [[#autour-de-markdown][Autour de =markdown=]] + * Syntaxe ** Headers #+BEGIN_EXAMPLE @@ -195,3 +196,4 @@ La conversion en =pdf= passe toujours par [[https://fr.wikipedia.org/wiki/LaTeX] Dans la petite démonstration, nous montrons comment générer un fichier =docx= à partir d'un fichier =md= avec =Pandoc= et nous soulignons qu'il est alors possible d'utiliser un traitement de texte comme =LibreOffice= pour modifier le fichier obtenu. Il est clair que si des modifications sont apportées au =docx= elle en seront pas (automatiquement) propagées au =md=. Il faudra utiliser =Pandoc= pour cela et effectuer une conversion de =docx= vers =md= (et seules les éléments du format =docx= qui existent en =md= seront conservés). Une stratégie qui est souvent employée et qui fonctionne bien en pratique consiste à faire le gros du travail de rédaction d'un article ou d'un mémoire en =Markdown=. La rédaction terminée, le fichier est exporté au format =docx= (ou =LaTeX=) et des ajustements de mise en page sont alors effectués avec un logiciel de traitement de texte (ou un éditeur =LaTeX=). + diff --git a/module2/ressources/sequence3_examples/tutorial.Rmd b/module2/ressources/sequence3_examples/tutorial.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..25cd4518ac8cbd49817cc6d274d3e66f3744931e --- /dev/null +++ b/module2/ressources/sequence3_examples/tutorial.Rmd @@ -0,0 +1,59 @@ +--- +title: "Mon premier document" +author: "Arnaud Legrand" +date: "10 octobre 2017" +output: word_document +--- + +## R Markdown + +This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see . + +When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this: + +```{r cars} +summary(cars) +``` + +## Including Plots + +You can also embed plots, for example: + +```{r pressure, echo=FALSE} +plot(pressure) +``` + +Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. + +## Ma propre section + +```{r} +x=1 +x +``` + +```{r} +x = x + 10 +x +``` +```{r} +hist(rnorm(1000)) +``` + +```{r} +hist(rnorm(100,mean = 2, sd = .2)) +``` + + + +## Un petit exemple avec d'autres langages +```{python} +from math import * +x = 3.14 +print(sin(x)) +``` + +```{python} +print(sin(x)) +``` + diff --git a/module2/ressources/sequence3_examples/tutorial.ipynb b/module2/ressources/sequence3_examples/tutorial.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..82cab93eb151c107aff9a8c43aafa39fc9b1129c --- /dev/null +++ b/module2/ressources/sequence3_examples/tutorial.ipynb @@ -0,0 +1,193 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Titre du document" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "2+2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n" + ] + } + ], + "source": [ + "x=10\n", + "print(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20\n" + ] + } + ], + "source": [ + "x = x + 10\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Petit exemple de completion" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "mu, sigma = 100, 15" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.random.normal(loc=mu, scale=sigma, size=10000)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "plt.hist(x)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Utilisation d'autres langages" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext rpy2.ipython" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%R\n", + "plot(cars)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/module2/ressources/sequence3_examples/tutorial.org b/module2/ressources/sequence3_examples/tutorial.org new file mode 100644 index 0000000000000000000000000000000000000000..86fdfe7ed8b5409d30e922f9d3346e0c590b315f --- /dev/null +++ b/module2/ressources/sequence3_examples/tutorial.org @@ -0,0 +1,171 @@ +# -*- coding: utf-8 -*- +# -*- mode: org -*- + +#+TITLE: Une petite démo d'Org-Mode +#+AUTHOR: Arnaud Legrand +#+STARTUP: overview indent inlineimages logdrawer +#+LANGUAGE: en +#+HTML_HEAD: +#+PROPERTY: header-args :eval never-export + +* Section 1 +** Sous-section +* Section 2 +** Foo +*** Hello +Avec du texte +- ici du *gras* +- et là, de /l'italique/ +*** Salut +*** Etc +** Bar +** Baz +* Exécution de calculs :noexport: + +#+begin_src R :results output :session *R* :exports both +cars +#+end_src + +#+RESULTS: +#+begin_example + speed dist +1 4 2 +2 4 10 +3 7 4 +4 7 22 +5 8 16 +6 9 10 +7 10 18 +8 10 26 +9 10 34 +10 11 17 +11 11 28 +12 12 14 +13 12 20 +14 12 24 +15 12 28 +16 13 26 +17 13 34 +18 13 34 +19 13 46 +20 14 26 +21 14 36 +22 14 60 +23 14 80 +24 15 20 +25 15 26 +26 15 54 +27 16 32 +28 16 40 +29 17 32 +30 17 40 +31 17 50 +32 18 42 +33 18 56 +34 18 76 +35 18 84 +36 19 36 +37 19 46 +38 19 68 +39 20 32 +40 20 48 +41 20 52 +42 20 56 +43 20 64 +44 22 66 +45 23 54 +46 24 70 +47 24 92 +48 24 93 +49 24 120 +50 25 85 +#+end_example + +#+begin_src R :results output graphics :file (org-babel-temp-file "figure" ".png") :exports results :width 600 :height 400 :session *R* +plot(cars) +#+end_src + +#+RESULTS: +[[file:/tmp/babel-148945lI/figure14894n0r.png]] +#+begin_src R :results output :session *R* :exports both +(x=10) +#+end_src + +#+RESULTS: +: [1] 10 + +#+begin_src R :results output :session *R* :exports both +(x = x+10) +#+end_src + +#+RESULTS: +: [1] 20 +* Autres langages + +#+begin_src python :results output :exports both +print(2+2) +#+end_src + +#+RESULTS: +: 4 + +#+begin_src shell :results output :exports both +ls /tmp +#+end_src + +#+RESULTS: +#+begin_example +babel-148945lI +babel-1933r-E +babel-7506nSG +emacs1000 +emacs14894axZ +firefox-esr_alegrand +mozilla_alegrand0 +pulse-PKdhtXMmr18n +RtmpsK10QZ +RtmpvMPlZs +ScientificMethodologyProjectGithub.ipynb +ssh-KQXcWTA8Cx6u +systemd-private-0461cab7d3944a9e974b73d23efc09af-apache2.service-QPpUU4 +systemd-private-0461cab7d3944a9e974b73d23efc09af-colord.service-wdsVAi +systemd-private-0461cab7d3944a9e974b73d23efc09af-iio-sensor-proxy.service-UYGEGU +systemd-private-0461cab7d3944a9e974b73d23efc09af-ModemManager.service-FKfsh9 +systemd-private-0461cab7d3944a9e974b73d23efc09af-rtkit-daemon.service-43AVDL +systemd-private-0461cab7d3944a9e974b73d23efc09af-systemd-timesyncd.service-4pB1fo +thunderbird_alegrand +tracker-extract-files.1000 +tutoriel.pdf +#+end_example + +#+begin_src shell :session *shell* :results output :exports both +hostname +#+end_src + +#+RESULTS: +: +: icarus + +#+begin_src shell :session *shell* :results output :exports both +ssh nipmuk +#+end_src + +#+RESULTS: +: The programs included with the Debian GNU/Linux system are free software; +: the exact distribution terms for each program are described in the +: individual files in /usr/share/doc/*/copyright. +: +: Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent +: permitted by applicable law. +: Last login: Tue Apr 10 12:10:47 2018 from ligone.imag.fr + +#+begin_src shell :session *shell* :results output :exports both +hostname +ls /tmp/ +#+end_src + +#+RESULTS: +: nipmuk +: ATN452-P5785-Linux-X64.bin tina_update vgauthsvclog.txt.0 +: P57 tn_pipe vmware-root +: ssh-0xgYrn2tUz upgrade_linux.batch diff --git a/module2/ressources/sequence6_examples/README.org b/module2/ressources/sequence6_examples/README.org index f363c6e0c7677568bf1475afc4eadd50e7c70c88..90c6ca60b29f620de00e5150f6fe5af24813e4f4 100644 --- a/module2/ressources/sequence6_examples/README.org +++ b/module2/ressources/sequence6_examples/README.org @@ -18,17 +18,23 @@ org-files. These documents depend on many other external data files and are not meant to lead to reproducible documents but it will give you an idea of how it can be organized: -1. [[file:journal.org][journal.org]]: an excerpt (I've only left a few code samples and links +1. [[file:td2_PS.ipynb][td2_PS.ipynb]]: this is a practical session (in French) on random + number generation for 1st year master students in computer + science. It uses the R language. In this teaching context, the main + advantage of using a jupyter notebook over other environments is + that students can use the University jupyterhub and thus do not + have to install anything on their laptop. +2. [[file:journal.org][journal.org]]: an excerpt (I've only left a few code samples and links to some resources on R, Stats, ...) from my own journal. This is a personal document where everything (meeting notes, hacking, random thoughts, ...) goes by default. Entries are created with the =C-c c= shortcut. -2. [[file:labbook_single.org][labbook_single.org]]: this is an excerpt from the laboratory notebook +3. [[file:labbook_single.org][labbook_single.org]]: this is an excerpt from the laboratory notebook [[https://cornebize.net/][Tom Cornebize]] wrote during his Master thesis internship under my supervision. This a personal labbook. I consider this notebook to be excellent and was the ideal level of details for us to communicate without any ambiguity and for him to move forward with confidence. -3. [[file:paper.org][paper.org]]: this is an ongoing paper based on the previous labbook of +4. [[file:paper.org][paper.org]]: this is an ongoing paper based on the previous labbook of Tom Cornebize. As such it is not reproducible as there are hardcoded paths and uncleaned dependencies but writing it from the labbook was super easy as we just had to cut and paste the parts we @@ -38,7 +44,7 @@ you an idea of how it can be organized: commands that are automatically executed when opening the file. It is an effective way to depend less on the =.emacs/init.el= which is generally customized by everyone. -4. [[file:labbook_several.org][labbook_several.org]]: this is a labbook for a specific project shared +5. [[file:labbook_several.org][labbook_several.org]]: this is a labbook for a specific project shared by several persons. As a consequence it starts with information about installation, common scripts, has section with notes about all our meetings, a section with information about experiments and an @@ -47,7 +53,7 @@ you an idea of how it can be organized: available in git so we did not bother. In such labbook, it is common to find annotations indicating that such experiment was =:FLAWED:= as it had some issues. -5. [[file:technical_report.org][technical_report.org]]: this is a short technical document I wrote +6. [[file:technical_report.org][technical_report.org]]: this is a short technical document I wrote after a colleague sent me a PDF describing an experiment he was conducting and asked me about how reproducible I felt it was. It turned out I had to cut and paste the C code from the PDF, then diff --git a/module2/ressources/sequence6_examples/README_fr.org b/module2/ressources/sequence6_examples/README_fr.org index e5d2b700838b533de1b590299cf242d08fc04f1a..c47041e1ce5e81bfc5dea5645e649cf188073824 100644 --- a/module2/ressources/sequence6_examples/README_fr.org +++ b/module2/ressources/sequence6_examples/README_fr.org @@ -20,7 +20,13 @@ fichiers externes et ne sont pas prévu pour permettre de produire directement des documents reproductibles mais ils peuvent vous donner une idée de la façon dont ils peuvent être organisés: -1. [[file:journal.org][journal.org]]: ceci est un extrait (je n'ai laissé que quelques +1. [[file:td2_PS.ipynb][td2_PS.ipynb]]: ceci est une feuille de TD (en français) sur la + génération de nombres aléatoires à destination d'étudiants de + première année de Master en informatique. Elle utilise le langage + R. Dans ce contexte d'enseignement, l'intérêt du notebook jupyter + est qu'ils peuvent utiliser le jupyterhub de l'université et n'ont + donc rien à installer sur leur machine. +2. [[file:journal.org][journal.org]]: ceci est un extrait (je n'ai laissé que quelques exemples de programmes et de liens vers des ressources sur R, les statistiques, etc.) de mon propre journal. C'est un document personnel dans lequel tout ce que je peux faire (notes prises @@ -28,14 +34,14 @@ une idée de la façon dont ils peuvent être organisés: variées, notes bibliographiques, ...) atterrit par défaut. Les entrées avec la date sont créées automatiquement à l'aide du raccourci =C-c c=. -2. [[file:labbook_single.org][labbook_single.org]]: ceci est un extrait du cahier de laboratoire +3. [[file:labbook_single.org][labbook_single.org]]: ceci est un extrait du cahier de laboratoire tenu par [[https://cornebize.net/][Tom Cornebize]] pendant son stage de Master sous ma direction. C'est un cahier de laboratoire personnel et que je considère comme excellent car il a le niveau de détail idéal pour nous permettre à la fois de communiquer sans aucune ambiguïté, pour moi, de bien suivre ses avancées, et pour lui, d'avancer dans ses travaux avec confiance. -3. [[file:paper.org][paper.org]]: ceci est un article en cours basé sur le cahier de +4. [[file:paper.org][paper.org]]: ceci est un article en cours basé sur le cahier de laboratoire précédent. En l'état, il n'est pas reproductible car il y a plusieurs chemins absolus en dur et des dépendances logicielles non explicitées mais sa rédaction à partir du cahier de laboratoire @@ -50,7 +56,7 @@ une idée de la façon dont ils peuvent être organisés: qui sont exécutées par emacs à l'ouverture du fichier. C'est une façon simple mais efficace de dépendre le moins possible du =.emacs/init.el= que chacun personnalise à sa convenance. -4. [[file:labbook_several.org][labbook_several.org]]: ceci est un petit exemple de cahier de +5. [[file:labbook_several.org][labbook_several.org]]: ceci est un petit exemple de cahier de laboratoire partagé par plusieurs personnes. Il commence donc par des informations sur les dépendances logicielles à installer, les scripts les plus utiles. On y trouve ensuite une section avec des @@ -70,7 +76,7 @@ une idée de la façon dont ils peuvent être organisés: nouvelle date) est en général alors ajoutée. L'annotation =:FLAWED:= nous permet de conserver l'ensemble des expériences tout en sachant d'un coup d'oeil lesquelles ne doivent pas être prises en compte. -5. [[file:technical_report.org][technical_report.org]]: ceci est un petit document technique que j'ai +6. [[file:technical_report.org][technical_report.org]]: ceci est un petit document technique que j'ai écrit après qu'un collègue m'ai envoyé un document PDF décrivant une expérience qu'il avait réalisé et souhaitait mon avis sur si c'était suffisant d'un point de vue reproductibilité. Il s'est diff --git a/module2/ressources/sequence6_examples/td2_PS.ipynb b/module2/ressources/sequence6_examples/td2_PS.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..26c7cf9982f3ad32fcf93d404cd22cee0fa0f61b --- /dev/null +++ b/module2/ressources/sequence6_examples/td2_PS.ipynb @@ -0,0 +1,1295 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# TD2: Générateurs pseudo-aléatoires (RICM4, 2013)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "L'objectif de cette fiche est de présenter les méthodes principales de génération de nombres pseudo-aléatoires, de comprendre leurs limitations, d'apprendre à s'en méfier et de voir comment éventuellement les corriger...\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Générateurs à base de congruence" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "congruent_random <- function(n = 100, a=4, b=2, m=9, x1=1) {\n", + " res = c(x1)\n", + " for(i in 2:n) {\n", + " res[i] = (a * res[i-1] + b) %% m\n", + " }\n", + " res\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Regardons les premières valeurs" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. 1
  2. \n", + "\t
  3. 6
  4. \n", + "\t
  5. 8
  6. \n", + "\t
  7. 7
  8. \n", + "\t
  9. 3
  10. \n", + "\t
  11. 5
  12. \n", + "\t
  13. 4
  14. \n", + "\t
  15. 0
  16. \n", + "\t
  17. 2
  18. \n", + "\t
  19. 1
  20. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate*}\n", + "\\item 1\n", + "\\item 6\n", + "\\item 8\n", + "\\item 7\n", + "\\item 3\n", + "\\item 5\n", + "\\item 4\n", + "\\item 0\n", + "\\item 2\n", + "\\item 1\n", + "\\end{enumerate*}\n" + ], + "text/markdown": [ + "1. 1\n", + "2. 6\n", + "3. 8\n", + "4. 7\n", + "5. 3\n", + "6. 5\n", + "7. 4\n", + "8. 0\n", + "9. 2\n", + "10. 1\n", + "\n", + "\n" + ], + "text/plain": [ + " [1] 1 6 8 7 3 5 4 0 2 1" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "congruent_random(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Regardons maintenant graphiquement ces valeurs" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAMAAADKOT/pAAADAFBMVEUAAAABAQECAgIDAwME\nBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUW\nFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJyco\nKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6\nOjo7Ozs8PDw9PT0+Pj4/Pz9AQEBBQUFCQkJDQ0NERERFRUVGRkZHR0dISEhJSUlKSkpLS0tM\nTExNTU1OTk5PT09QUFBRUVFSUlJTU1NUVFRVVVVWVlZXV1dYWFhZWVlaWlpbW1tcXFxdXV1e\nXl5fX19gYGBhYWFiYmJjY2NkZGRlZWVmZmZnZ2doaGhpaWlqampra2tsbGxtbW1ubm5vb29w\ncHBxcXFycnJzc3N0dHR1dXV2dnZ3d3d4eHh5eXl6enp7e3t8fHx9fX1+fn5/f3+AgICBgYGC\ngoKDg4OEhISFhYWGhoaHh4eIiIiJiYmKioqLi4uMjIyNjY2Ojo6Pj4+QkJCRkZGSkpKTk5OU\nlJSVlZWWlpaXl5eYmJiZmZmampqbm5ucnJydnZ2enp6fn5+goKChoaGioqKjo6OkpKSlpaWm\npqanp6eoqKipqamqqqqrq6usrKytra2urq6vr6+wsLCxsbGysrKzs7O0tLS1tbW2tra3t7e4\nuLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fIyMjJycnK\nysrLy8vMzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc\n3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u\n7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7////i\nsF19AAAACXBIWXMAABJ0AAASdAHeZh94AAAgAElEQVR4nO3dCZhU1Znw8be6oWkb2URAkEUb\ng4i4RBEbJMRPMSC474i7BjSjMS6JUaPRkM3RSUzGMc7EBYMzSdRkcEaNCigTcde4Mm4RDC5g\n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", + "text/plain": [ + "Plot with title “Histogram of X”" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graphical_check <- function(X) {\n", + " par(mfrow=c(1,2))\n", + " hist(X)\n", + " plot(X[1:length(X)-1],X[2:length(X)])\n", + "}\n", + "graphical_check(congruent_random(100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Évidemment, l'espace d'état est trop petit. Essayons avec d'autres paramètres." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAMAAADKOT/pAAADAFBMVEUAAAABAQECAgIDAwME\nBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUW\nFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJyco\nKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6\nOjo7Ozs8PDw9PT0+Pj4/Pz9AQEBBQUFCQkJDQ0NERERFRUVGRkZHR0dISEhJSUlKSkpLS0tM\nTExNTU1OTk5PT09QUFBRUVFSUlJTU1NUVFRVVVVWVlZXV1dYWFhZWVlaWlpbW1tcXFxdXV1e\nXl5fX19gYGBhYWFiYmJjY2NkZGRlZWVmZmZnZ2doaGhpaWlqampra2tsbGxtbW1ubm5vb29w\ncHBxcXFycnJzc3N0dHR1dXV2dnZ3d3d4eHh5eXl6enp7e3t8fHx9fX1+fn5/f3+AgICBgYGC\ngoKDg4OEhISFhYWGhoaHh4eIiIiJiYmKioqLi4uMjIyNjY2Ojo6Pj4+QkJCRkZGSkpKTk5OU\nlJSVlZWWlpaXl5eYmJiZmZmampqbm5ucnJydnZ2enp6fn5+goKChoaGioqKjo6OkpKSlpaWm\npqanp6eoqKipqamqqqqrq6usrKytra2urq6vr6+wsLCxsbGysrKzs7O0tLS1tbW2tra3t7e4\nuLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fIyMjJycnK\nysrLy8vMzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc\n3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u\n7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7////i\nsF19AAAACXBIWXMAABJ0AAASdAHeZh94AAAgAElEQVR4nO2dCXwTRfvHnyS9aEspR4EWWk6x\nVECQqyCXgByVGwSRS174cygICt6+iOKBgjf64gGi4In6oq+AiAKKCqKCgqggAiKnIFAECpR2\n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\nAAAAAElFTkSuQmCC", + "text/plain": [ + "Plot with title “Histogram of X”" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graphical_check(congruent_random(n=100,a=11,b=1,m=71))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cela parait mieux mais en s'intéressant à la corrélation et à la covariance entre $X_n$ et $X_{n+1}$, le fait que nos nombres ne sont pas indépendants les uns des autres est plus évident." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "0.0457750907128348" + ], + "text/latex": [ + "0.0457750907128348" + ], + "text/markdown": [ + "0.0457750907128348" + ], + "text/plain": [ + "[1] 0.04577509" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "19.0913087436134" + ], + "text/latex": [ + "19.0913087436134" + ], + "text/markdown": [ + "19.0913087436134" + ], + "text/plain": [ + "[1] 19.09131" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X <- congruent_random(n=1000,a=11,b=1,m=71)\n", + "cor(X[1:length(X)-1],X[2:length(X)])\n", + "cov(X[1:length(X)-1],X[2:length(X)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Il faut donc être suspicieux avec les générateurs de nombres alétaoires et leur faire subir plusieurs tests." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Générateurs à décalage de registres" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] 4\n" + ] + }, + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. 1
  2. \n", + "\t
  3. 0
  4. \n", + "\t
  5. 1
  6. \n", + "\t
  7. 0
  8. \n", + "\t
  9. 0
  10. \n", + "\t
  11. 0
  12. \n", + "\t
  13. 1
  14. \n", + "\t
  15. 0
  16. \n", + "\t
  17. 1
  18. \n", + "\t
  19. 0
  20. \n", + "\t
  21. 0
  22. \n", + "\t
  23. 0
  24. \n", + "\t
  25. 1
  26. \n", + "\t
  27. 0
  28. \n", + "\t
  29. 1
  30. \n", + "\t
  31. 0
  32. \n", + "\t
  33. 0
  34. \n", + "\t
  35. 0
  36. \n", + "\t
  37. 1
  38. \n", + "\t
  39. 0
  40. \n", + "\t
  41. 1
  42. \n", + "\t
  43. 0
  44. \n", + "\t
  45. 0
  46. \n", + "\t
  47. 0
  48. \n", + "\t
  49. 1
  50. \n", + "\t
  51. 0
  52. \n", + "\t
  53. 1
  54. \n", + "\t
  55. 0
  56. \n", + "\t
  57. 0
  58. \n", + "\t
  59. 0
  60. \n", + "\t
  61. 1
  62. \n", + "\t
  63. 0
  64. \n", + "\t
  65. 1
  66. \n", + "\t
  67. 0
  68. \n", + "\t
  69. 0
  70. \n", + "\t
  71. 0
  72. \n", + "\t
  73. 1
  74. \n", + "\t
  75. 0
  76. \n", + "\t
  77. 1
  78. \n", + "\t
  79. 0
  80. \n", + "\t
  81. 0
  82. \n", + "\t
  83. 0
  84. \n", + "\t
  85. 1
  86. \n", + "\t
  87. 0
  88. \n", + "\t
  89. 1
  90. \n", + "\t
  91. 0
  92. \n", + "\t
  93. 0
  94. \n", + "\t
  95. 0
  96. \n", + "\t
  97. 1
  98. \n", + "\t
  99. 0
  100. \n", + "\t
  101. 1
  102. \n", + "\t
  103. 0
  104. \n", + "\t
  105. 0
  106. \n", + "\t
  107. 0
  108. \n", + "\t
  109. 1
  110. \n", + "\t
  111. 0
  112. \n", + "\t
  113. 1
  114. \n", + "\t
  115. 0
  116. \n", + "\t
  117. 0
  118. \n", + "\t
  119. 0
  120. \n", + "\t
  121. 1
  122. \n", + "\t
  123. 0
  124. \n", + "\t
  125. 1
  126. \n", + "\t
  127. 0
  128. \n", + "\t
  129. 0
  130. \n", + "\t
  131. 0
  132. \n", + "\t
  133. 1
  134. \n", + "\t
  135. 0
  136. \n", + "\t
  137. 1
  138. \n", + "\t
  139. 0
  140. \n", + "\t
  141. 0
  142. \n", + "\t
  143. 0
  144. \n", + "\t
  145. 1
  146. \n", + "\t
  147. 0
  148. \n", + "\t
  149. 1
  150. \n", + "\t
  151. 0
  152. \n", + "\t
  153. 0
  154. \n", + "\t
  155. 0
  156. \n", + "\t
  157. 1
  158. \n", + "\t
  159. 0
  160. \n", + "\t
  161. 1
  162. \n", + "\t
  163. 0
  164. \n", + "\t
  165. 0
  166. \n", + "\t
  167. 0
  168. \n", + "\t
  169. 1
  170. \n", + "\t
  171. 0
  172. \n", + "\t
  173. 1
  174. \n", + "\t
  175. 0
  176. \n", + "\t
  177. 0
  178. \n", + "\t
  179. 0
  180. \n", + "\t
  181. 1
  182. \n", + "\t
  183. 0
  184. \n", + "\t
  185. 1
  186. \n", + "\t
  187. 0
  188. \n", + "\t
  189. 0
  190. \n", + "\t
  191. 0
  192. \n", + "\t
  193. 1
  194. \n", + "\t
  195. 0
  196. \n", + "\t
  197. 1
  198. \n", + "\t
  199. 0
  200. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate*}\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\end{enumerate*}\n" + ], + "text/markdown": [ + "1. 1\n", + "2. 0\n", + "3. 1\n", + "4. 0\n", + "5. 0\n", + "6. 0\n", + "7. 1\n", + "8. 0\n", + "9. 1\n", + "10. 0\n", + "11. 0\n", + "12. 0\n", + "13. 1\n", + "14. 0\n", + "15. 1\n", + "16. 0\n", + "17. 0\n", + "18. 0\n", + "19. 1\n", + "20. 0\n", + "21. 1\n", + "22. 0\n", + "23. 0\n", + "24. 0\n", + "25. 1\n", + "26. 0\n", + "27. 1\n", + "28. 0\n", + "29. 0\n", + "30. 0\n", + "31. 1\n", + "32. 0\n", + "33. 1\n", + "34. 0\n", + "35. 0\n", + "36. 0\n", + "37. 1\n", + "38. 0\n", + "39. 1\n", + "40. 0\n", + "41. 0\n", + "42. 0\n", + "43. 1\n", + "44. 0\n", + "45. 1\n", + "46. 0\n", + "47. 0\n", + "48. 0\n", + "49. 1\n", + "50. 0\n", + "51. 1\n", + "52. 0\n", + "53. 0\n", + "54. 0\n", + "55. 1\n", + "56. 0\n", + "57. 1\n", + "58. 0\n", + "59. 0\n", + "60. 0\n", + "61. 1\n", + "62. 0\n", + "63. 1\n", + "64. 0\n", + "65. 0\n", + "66. 0\n", + "67. 1\n", + "68. 0\n", + "69. 1\n", + "70. 0\n", + "71. 0\n", + "72. 0\n", + "73. 1\n", + "74. 0\n", + "75. 1\n", + "76. 0\n", + "77. 0\n", + "78. 0\n", + "79. 1\n", + "80. 0\n", + "81. 1\n", + "82. 0\n", + "83. 0\n", + "84. 0\n", + "85. 1\n", + "86. 0\n", + "87. 1\n", + "88. 0\n", + "89. 0\n", + "90. 0\n", + "91. 1\n", + "92. 0\n", + "93. 1\n", + "94. 0\n", + "95. 0\n", + "96. 0\n", + "97. 1\n", + "98. 0\n", + "99. 1\n", + "100. 0\n", + "\n", + "\n" + ], + "text/plain": [ + " [1] 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1\n", + " [38] 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0\n", + " [75] 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] 4\n" + ] + }, + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. 1
  2. \n", + "\t
  3. 0
  4. \n", + "\t
  5. 0
  6. \n", + "\t
  7. 1
  8. \n", + "\t
  9. 1
  10. \n", + "\t
  11. 1
  12. \n", + "\t
  13. 1
  14. \n", + "\t
  15. 0
  16. \n", + "\t
  17. 0
  18. \n", + "\t
  19. 1
  20. \n", + "\t
  21. 1
  22. \n", + "\t
  23. 1
  24. \n", + "\t
  25. 1
  26. \n", + "\t
  27. 0
  28. \n", + "\t
  29. 0
  30. \n", + "\t
  31. 1
  32. \n", + "\t
  33. 1
  34. \n", + "\t
  35. 1
  36. \n", + "\t
  37. 1
  38. \n", + "\t
  39. 0
  40. \n", + "\t
  41. 0
  42. \n", + "\t
  43. 1
  44. \n", + "\t
  45. 1
  46. \n", + "\t
  47. 1
  48. \n", + "\t
  49. 1
  50. \n", + "\t
  51. 0
  52. \n", + "\t
  53. 0
  54. \n", + "\t
  55. 1
  56. \n", + "\t
  57. 1
  58. \n", + "\t
  59. 1
  60. \n", + "\t
  61. 1
  62. \n", + "\t
  63. 0
  64. \n", + "\t
  65. 0
  66. \n", + "\t
  67. 1
  68. \n", + "\t
  69. 1
  70. \n", + "\t
  71. 1
  72. \n", + "\t
  73. 1
  74. \n", + "\t
  75. 0
  76. \n", + "\t
  77. 0
  78. \n", + "\t
  79. 1
  80. \n", + "\t
  81. 1
  82. \n", + "\t
  83. 1
  84. \n", + "\t
  85. 1
  86. \n", + "\t
  87. 0
  88. \n", + "\t
  89. 0
  90. \n", + "\t
  91. 1
  92. \n", + "\t
  93. 1
  94. \n", + "\t
  95. 1
  96. \n", + "\t
  97. 1
  98. \n", + "\t
  99. 0
  100. \n", + "\t
  101. 0
  102. \n", + "\t
  103. 1
  104. \n", + "\t
  105. 1
  106. \n", + "\t
  107. 1
  108. \n", + "\t
  109. 1
  110. \n", + "\t
  111. 0
  112. \n", + "\t
  113. 0
  114. \n", + "\t
  115. 1
  116. \n", + "\t
  117. 1
  118. \n", + "\t
  119. 1
  120. \n", + "\t
  121. 1
  122. \n", + "\t
  123. 0
  124. \n", + "\t
  125. 0
  126. \n", + "\t
  127. 1
  128. \n", + "\t
  129. 1
  130. \n", + "\t
  131. 1
  132. \n", + "\t
  133. 1
  134. \n", + "\t
  135. 0
  136. \n", + "\t
  137. 0
  138. \n", + "\t
  139. 1
  140. \n", + "\t
  141. 1
  142. \n", + "\t
  143. 1
  144. \n", + "\t
  145. 1
  146. \n", + "\t
  147. 0
  148. \n", + "\t
  149. 0
  150. \n", + "\t
  151. 1
  152. \n", + "\t
  153. 1
  154. \n", + "\t
  155. 1
  156. \n", + "\t
  157. 1
  158. \n", + "\t
  159. 0
  160. \n", + "\t
  161. 0
  162. \n", + "\t
  163. 1
  164. \n", + "\t
  165. 1
  166. \n", + "\t
  167. 1
  168. \n", + "\t
  169. 1
  170. \n", + "\t
  171. 0
  172. \n", + "\t
  173. 0
  174. \n", + "\t
  175. 1
  176. \n", + "\t
  177. 1
  178. \n", + "\t
  179. 1
  180. \n", + "\t
  181. 1
  182. \n", + "\t
  183. 0
  184. \n", + "\t
  185. 0
  186. \n", + "\t
  187. 1
  188. \n", + "\t
  189. 1
  190. \n", + "\t
  191. 1
  192. \n", + "\t
  193. 1
  194. \n", + "\t
  195. 0
  196. \n", + "\t
  197. 0
  198. \n", + "\t
  199. 1
  200. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate*}\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\end{enumerate*}\n" + ], + "text/markdown": [ + "1. 1\n", + "2. 0\n", + "3. 0\n", + "4. 1\n", + "5. 1\n", + "6. 1\n", + "7. 1\n", + "8. 0\n", + "9. 0\n", + "10. 1\n", + "11. 1\n", + "12. 1\n", + "13. 1\n", + "14. 0\n", + "15. 0\n", + "16. 1\n", + "17. 1\n", + "18. 1\n", + "19. 1\n", + "20. 0\n", + "21. 0\n", + "22. 1\n", + "23. 1\n", + "24. 1\n", + "25. 1\n", + "26. 0\n", + "27. 0\n", + "28. 1\n", + "29. 1\n", + "30. 1\n", + "31. 1\n", + "32. 0\n", + "33. 0\n", + "34. 1\n", + "35. 1\n", + "36. 1\n", + "37. 1\n", + "38. 0\n", + "39. 0\n", + "40. 1\n", + "41. 1\n", + "42. 1\n", + "43. 1\n", + "44. 0\n", + "45. 0\n", + "46. 1\n", + "47. 1\n", + "48. 1\n", + "49. 1\n", + "50. 0\n", + "51. 0\n", + "52. 1\n", + "53. 1\n", + "54. 1\n", + "55. 1\n", + "56. 0\n", + "57. 0\n", + "58. 1\n", + "59. 1\n", + "60. 1\n", + "61. 1\n", + "62. 0\n", + "63. 0\n", + "64. 1\n", + "65. 1\n", + "66. 1\n", + "67. 1\n", + "68. 0\n", + "69. 0\n", + "70. 1\n", + "71. 1\n", + "72. 1\n", + "73. 1\n", + "74. 0\n", + "75. 0\n", + "76. 1\n", + "77. 1\n", + "78. 1\n", + "79. 1\n", + "80. 0\n", + "81. 0\n", + "82. 1\n", + "83. 1\n", + "84. 1\n", + "85. 1\n", + "86. 0\n", + "87. 0\n", + "88. 1\n", + "89. 1\n", + "90. 1\n", + "91. 1\n", + "92. 0\n", + "93. 0\n", + "94. 1\n", + "95. 1\n", + "96. 1\n", + "97. 1\n", + "98. 0\n", + "99. 0\n", + "100. 1\n", + "\n", + "\n" + ], + "text/plain": [ + " [1] 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1\n", + " [38] 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0\n", + " [75] 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X=xor_random <- function(n = 100, filter=c(1,0,1,0), seed=c(1,0,1,0)) {\n", + " res = seed\n", + " m = length(filter)\n", + " print(m)\n", + " for(i in (length(seed)):(n-1)) { # Yes, you need to put parenthesis around n-1 :(\n", + " res[i+1] = sum(filter*(res[(i-m+1):i]))%%2 # Yes, you need to put parenthesis around i-m+1 :(\n", + " }\n", + " res\n", + "}\n", + "xor_random()\n", + "xor_random(seed=c(1,0,0,1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ouh là, tout ceci n'a rien d'aléatoire. Il y a deux séquences entrelacées et la longueur du cycle est 8. Essayons avec d'autres paramètres." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] 4\n" + ] + }, + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. 1
  2. \n", + "\t
  3. 1
  4. \n", + "\t
  5. 0
  6. \n", + "\t
  7. 1
  8. \n", + "\t
  9. 0
  10. \n", + "\t
  11. 1
  12. \n", + "\t
  13. 1
  14. \n", + "\t
  15. 1
  16. \n", + "\t
  17. 1
  18. \n", + "\t
  19. 0
  20. \n", + "\t
  21. 0
  22. \n", + "\t
  23. 0
  24. \n", + "\t
  25. 1
  26. \n", + "\t
  27. 0
  28. \n", + "\t
  29. 0
  30. \n", + "\t
  31. 1
  32. \n", + "\t
  33. 1
  34. \n", + "\t
  35. 0
  36. \n", + "\t
  37. 1
  38. \n", + "\t
  39. 0
  40. \n", + "\t
  41. 1
  42. \n", + "\t
  43. 1
  44. \n", + "\t
  45. 1
  46. \n", + "\t
  47. 1
  48. \n", + "\t
  49. 0
  50. \n", + "\t
  51. 0
  52. \n", + "\t
  53. 0
  54. \n", + "\t
  55. 1
  56. \n", + "\t
  57. 0
  58. \n", + "\t
  59. 0
  60. \n", + "\t
  61. 1
  62. \n", + "\t
  63. 1
  64. \n", + "\t
  65. 0
  66. \n", + "\t
  67. 1
  68. \n", + "\t
  69. 0
  70. \n", + "\t
  71. 1
  72. \n", + "\t
  73. 1
  74. \n", + "\t
  75. 1
  76. \n", + "\t
  77. 1
  78. \n", + "\t
  79. 0
  80. \n", + "\t
  81. 0
  82. \n", + "\t
  83. 0
  84. \n", + "\t
  85. 1
  86. \n", + "\t
  87. 0
  88. \n", + "\t
  89. 0
  90. \n", + "\t
  91. 1
  92. \n", + "\t
  93. 1
  94. \n", + "\t
  95. 0
  96. \n", + "\t
  97. 1
  98. \n", + "\t
  99. 0
  100. \n", + "\t
  101. 1
  102. \n", + "\t
  103. 1
  104. \n", + "\t
  105. 1
  106. \n", + "\t
  107. 1
  108. \n", + "\t
  109. 0
  110. \n", + "\t
  111. 0
  112. \n", + "\t
  113. 0
  114. \n", + "\t
  115. 1
  116. \n", + "\t
  117. 0
  118. \n", + "\t
  119. 0
  120. \n", + "\t
  121. 1
  122. \n", + "\t
  123. 1
  124. \n", + "\t
  125. 0
  126. \n", + "\t
  127. 1
  128. \n", + "\t
  129. 0
  130. \n", + "\t
  131. 1
  132. \n", + "\t
  133. 1
  134. \n", + "\t
  135. 1
  136. \n", + "\t
  137. 1
  138. \n", + "\t
  139. 0
  140. \n", + "\t
  141. 0
  142. \n", + "\t
  143. 0
  144. \n", + "\t
  145. 1
  146. \n", + "\t
  147. 0
  148. \n", + "\t
  149. 0
  150. \n", + "\t
  151. 1
  152. \n", + "\t
  153. 1
  154. \n", + "\t
  155. 0
  156. \n", + "\t
  157. 1
  158. \n", + "\t
  159. 0
  160. \n", + "\t
  161. 1
  162. \n", + "\t
  163. 1
  164. \n", + "\t
  165. 1
  166. \n", + "\t
  167. 1
  168. \n", + "\t
  169. 0
  170. \n", + "\t
  171. 0
  172. \n", + "\t
  173. 0
  174. \n", + "\t
  175. 1
  176. \n", + "\t
  177. 0
  178. \n", + "\t
  179. 0
  180. \n", + "\t
  181. 1
  182. \n", + "\t
  183. 1
  184. \n", + "\t
  185. 0
  186. \n", + "\t
  187. 1
  188. \n", + "\t
  189. 0
  190. \n", + "\t
  191. 1
  192. \n", + "\t
  193. 1
  194. \n", + "\t
  195. 1
  196. \n", + "\t
  197. 1
  198. \n", + "\t
  199. 0
  200. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate*}\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 0\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 1\n", + "\\item 0\n", + "\\end{enumerate*}\n" + ], + "text/markdown": [ + "1. 1\n", + "2. 1\n", + "3. 0\n", + "4. 1\n", + "5. 0\n", + "6. 1\n", + "7. 1\n", + "8. 1\n", + "9. 1\n", + "10. 0\n", + "11. 0\n", + "12. 0\n", + "13. 1\n", + "14. 0\n", + "15. 0\n", + "16. 1\n", + "17. 1\n", + "18. 0\n", + "19. 1\n", + "20. 0\n", + "21. 1\n", + "22. 1\n", + "23. 1\n", + "24. 1\n", + "25. 0\n", + "26. 0\n", + "27. 0\n", + "28. 1\n", + "29. 0\n", + "30. 0\n", + "31. 1\n", + "32. 1\n", + "33. 0\n", + "34. 1\n", + "35. 0\n", + "36. 1\n", + "37. 1\n", + "38. 1\n", + "39. 1\n", + "40. 0\n", + "41. 0\n", + "42. 0\n", + "43. 1\n", + "44. 0\n", + "45. 0\n", + "46. 1\n", + "47. 1\n", + "48. 0\n", + "49. 1\n", + "50. 0\n", + "51. 1\n", + "52. 1\n", + "53. 1\n", + "54. 1\n", + "55. 0\n", + "56. 0\n", + "57. 0\n", + "58. 1\n", + "59. 0\n", + "60. 0\n", + "61. 1\n", + "62. 1\n", + "63. 0\n", + "64. 1\n", + "65. 0\n", + "66. 1\n", + "67. 1\n", + "68. 1\n", + "69. 1\n", + "70. 0\n", + "71. 0\n", + "72. 0\n", + "73. 1\n", + "74. 0\n", + "75. 0\n", + "76. 1\n", + "77. 1\n", + "78. 0\n", + "79. 1\n", + "80. 0\n", + "81. 1\n", + "82. 1\n", + "83. 1\n", + "84. 1\n", + "85. 0\n", + "86. 0\n", + "87. 0\n", + "88. 1\n", + "89. 0\n", + "90. 0\n", + "91. 1\n", + "92. 1\n", + "93. 0\n", + "94. 1\n", + "95. 0\n", + "96. 1\n", + "97. 1\n", + "98. 1\n", + "99. 1\n", + "100. 0\n", + "\n", + "\n" + ], + "text/plain": [ + " [1] 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1\n", + " [38] 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0\n", + " [75] 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xor_random(filter=c(1,1,0,0),seed=c(1,1,0,1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cela semble mieux, la longueur du cycle est de 16. Est-ce satisfaisant pour autant ? À vous de voir... À vous de concevoir de nouveaux algorithmes de génération et d'imaginer des tests d'aléa.." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Well, maybe those numbers are just intrinsically better!](http://imgs.xkcd.com/comics/ayn_random.png)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "R", + "language": "R", + "name": "ir" + }, + "language_info": { + "codemirror_mode": "r", + "file_extension": ".r", + "mimetype": "text/x-r-source", + "name": "R", + "pygments_lexer": "r", + "version": "3.4.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}