数学とかそこらへんのブログ

数学が役に立たないと考えた数学科生によるブログ

matplotlibで遊ぶ

どうもpisです.

というわけでprocessingを始めました。エディタ使いにくいですはい.

processingの素数判定のプログラムはここにおいておきます.

int N = 100;
int isPrime(int p){
    if(p < 2) return 0;
    else if(p == 2 || p == 3) return 1;
    else if(p % 2 == 0) return 0;
    else{
        int i = 3;
    
        while(i < p){
            int S = p % i;
            i += 2;
        
            if(S == 0) return 0;
        }

        return 1;
    }
}


void setup(){
    //int count = 0;
    for (int p = 1; p < N; p ++){
        if(isPrime(p) == 1){
            print(p);
            println(" is prime");
            count += 1;
        }
        else{
            print(p);
            println(" is not prime");
        }
    }
}

まあ,素数判定の説明は不要ですよね.本題はpythonでgifを作った話です.

こんなのを作ってました.

f:id:pisceday:20181128022256g:plain

pythonでアニメーションを作りたい!!!!って思って調べたらmatplotlibでできるみたいで,試してみました. 勿論,processingやpygameのほうがアニメーション作るうえでは優秀だと思う(確信はない)のでしばらくpythonとはおさらば.

というわけですが,単振動する点を作ったのでそのプログラムをば.あ,jupyter notebookで作成しています.

%matplotlib notebook

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
import math

fig = plt.figure()
ims = []
inte = 100

for i in range(inte):
    x = math.sin(i / 50 * np.pi)
    img = plt.plot([x], [0], c = 'b', marker = 'o')
    plt.ylim(1.5, -1.5)
    
    ims.append(img)

ani = animation.ArtistAnimation(fig, ims, interval = 50)
ani.save('単振動.gif', writer = 'imagemagick')
plt.show()
%matplotlib notebook

の宣言は必須みたいでこれでアニメーションが扱えるようになるみたいです(?). imgにplotを代入してimsに集める.それぞれのplotに対して画像を作成して,それをgif化する.こんな感じ何ですかね(適当).

f:id:pisceday:20181128031416g:plain

ということで

twitterには投稿できなかったのでこっちで投稿してみようかなと.

ウラムの螺旋 - Wikipedia ですね. gifはこちらです.

f:id:pisceday:20181128022807g:plain

1からN = 1089までのウラムの螺旋です.なんか,模様がしゅごい(小並感). ということで,クソコードをば.

# 変数
N = 33 ** 2 # 1089

# 固定
## matplot周りの設定
ims = []
coor = []
fig = plt.figure()

## 描写変数設定
c = np.array([0, 0])
v = np.array([1, 0])
count = 0
flag = 0
cmax = 1

# function
def isPrime(p):
    if p < 2: return False
    elif p == 2 or p == 3: return True
    elif p % 2 == 0: return False
    else:
        i = 3

        while i < p:
            S = p % i

            if S:
                i += 2
                continue
            else:
                return 0

        return 1

def drawPrime(coor):
    img = plt.plot(coor[0][0], coor[0][1], c = 'b', marker = 'o')

    for i in coor[:-1]:
        img += plt.plot(i[0], i[1], c = 'b', marker = 'o')

    return img


# main
for i in range(N):
    if isPrime(i + 1):
        coor.append(copy.deepcopy(c))
        ims.append(drawPrime(coor))

    count += 1
    c += v

    if count == cmax:
        v = v[::-1] * (-1) ** (flag + 1)
        count = 0

        if flag:
            flag = 0
            cmax += 1

        else:
            flag = 1


ani = animation.ArtistAnimation(fig, ims, interval = 50)
ani.save('prime_' + str(N) + '.gif', writer = 'imagemagick')
plt.show()

こうやってpythonで動くgifを簡単に作れるのはいいですね.ということでお疲れ様でした. ではでは〜.

AtCoder Beginner Contest 112に参加したので

どうも!!!!!!!!!!!!!! とりあえず、たまたまバイトが早く終わったので以下のコンテストに参加しました。

abc112.contest.atcoder.jp

とりあえず、A, B, Dだけできたのでここに残しておきます。解説らしい解説はないです。

A

この問題文せこいわ。

def run():
    N = int(input())

    if N == 1:
        print('Hello World')

    else:
        print(int(input()) + int(input()))

if __name__ == '__main__':
    run()

まあこれは簡単だと思います。

B

def run():
    N, T = (int(x) for x in input().split())
    cost = 1001
    for _ in range(N):
        c, t = (int(x) for x in input().split())
        if t <= T and cost > c:
            cost = c

    print(cost if cost <= 1000 else 'TLE')


if __name__ == '__main__':
    run()

こんな感じでどうでしょうか。

D

これは$x_i (i = 1, 2, \ldots, N)$の最大公約数を $d\in \mathbb{N}$ とすると、$\sum_{i = 1, 2, ... , N} x_i$は$d$の倍数です。 すなわち、dはMの約数なのですね。 というわけでM // Nから降順にMを割っていって割り切れたらそれが答えですね。ここでLTE出したのでつらかったですね。

def run():
    N, M = (int(x) for x in input().split())

    for i in range(M // N, 0, -1):
        if M % i == 0:
            print(i)
            break



if __name__ == '__main__':
    run()

こんな感じで、 Cが難しかったのですが、某チョクダイ氏の解説生放送で基礎がなってないと言われました。




知 っ て た










では~

競プロ日記

進捗0です

課題に追われてました


















Fin














というわけにもいかず、何か進捗出さないとなあと思いましてねえ。 まあ、二分木の原理が少しもわからないんでね。ちょっとバイナリ勉強しないとなあと思ったわけですが、Python入門のバイナリの欄が少なすぎたので詰みました。 結局はネットに頼らないといけないわけです。バイナリでデータ構造の原理を理解することを今週の目標にして。。。

あとはですね。積分論の課題とその勉強が必要になってきますね。
気が遠くなりそう。

まあこんな感じで確率論と統計と代数を生き甲斐に頑張りたいと思います。
いつかこの記事も有益な記事を輩出できるようになったらいいですね。
では

三回生になったので


最近末期なpisです。ubuntuでファイル開くじゃないですか、その時にsublimeを使うと若干マウスに頼ってしまうので面倒なんですよ。でもvimはどうですか。ある程度の環境をそろえれば簡単な閲覧、記述なら手の動きを最小限に抑えることができるんですよ。最高じゃないですか。おかげでsublimeでも保存するとき「:wq」をおs(ry

そろそろpythonを強化しないといけないなと思ったのでここに一部を記録していくことにします。
ちょっと4月はエンジンがかからなかったのと、環境が変わったのでいろいろ大変でした。まだ大変なのですが、とりあえず競技プログラミングができるくらいまで落ち着いたので、そうだ、pythonで競プロやろう。ということなんですが、課題やサークルやらで少し忙しいのでしばらくははかどらないかも。とりあえず、目標やなんやらをここに記すことにします。

まあpythonということなんでね、機械学習はできておいた方がいいんじゃないか、って最近思ったのですが、どうなんでしょう。個人的にかなり気になるのでやりたいのですが。。。キャパオーバーの引き金になりかねないですから、少し様子見をします。とりあえず、競プロ本命に頑張りたいです。

目標

卒業まで

  • 機械学習
  • Pythonで確率・数理的処理

    今年度中

  • 確率論
  • 統計
    -----秋に統計検定2級を受ける予定(様子見。。。?)
  • 競技プログラミング
    -----詳細はatcoderのレベルがわからないので、詳細の目標指定は今は控えます

とりあえず、確率・統計に強い人目指します。 意識高くブログなんて書いてますが、正直続く気がしないので。いやはや。とりあえず、目標という名の標識は立てておいたので毎週でもなにをやったかここに記していきたいです。
とりあえず、最初にやるべきことはpythonのバイナリ周りの勉強です。ここらへんの話がわからないと二分木がきついらしい。Atcoderのコンテストに参加するために、私はAIZUで練習しているのですが、少しでもアルゴリズムを使用する問題になったら、時間が足りない。
まあ、二分木を作成するのに

[root, [left, right]]

みたいにできるのですがね。なんかすごいことになりそう(小並感)。
てなわけで、最初はバイナリ、ついでにファイル操作も調べてしか使ってなかったのでこの機会に勉強してみたいですね。
こいつで

入門 Python 3

入門 Python 3

入門(笑)



てなわけで、とりあえず。。。自分自身を監視もとにおいてやらなくちゃi駄文、閲覧ありがとうございました~。









おまけ、いままでやってきたこと

文字列を動かして遊んでた。いや、文字がくねくねしているといった方がいいですかね。

まあ、ソースコードだけ置いておきます。 gif作ろうかなと思ったけど面倒だったので()

import time, random

k = 0
times = 0.1
strings = "Python"
maxi = 50
mini = 2

while True:
    j = random.randint(mini, maxi)
    l = random.randint(0, j - 2)

    for i in range(j):
        print(" " * (i + k) + strings)
        time.sleep(times)

    for i in range(j + k - 2, l, -1):
        print(" " * i + strings)
        time.sleep(times)
    k = l

while True かつwhileを止めるものがいないのでなのでcntl + Cをしない限り止まりません。
times:文字を出力する間隔
strings:出力文字
まあこんな感じなので適当に値をいじって遊んでみると、なんと、時間が無駄に消費できますよ。

ではでは~~。

暑い

そうだ,まだ26時なのだ(ブログを書いている時間).

暑い夜を過ごしているpisです.

ブログを書こうと言って早2ヶ月,そろそろ書かないとなということでとりあえず手を動かしながらネタ探しをしていますが,まあ見つからないですね()

今後したいことを大雑把にまとめます.

自己紹介

name:pis

twitter:@7pitps

プログラミング言語:Python ,Ruby

趣味: 数学,音ゲー(pop'nなど)

数学で興味がある分野

  • 代数

    みんな大好きですよね(ですよね?).

  • 位相幾何学

    球を裏返してみる動画をきっかけにとても興味を持つことに. 何度も見返して,理解を深めた記憶が.

  • 確率論

    高校生の時から確率がとても好きでした.ということで確率論はしっかり勉強したい.条件付き確率面白い,いいね?

    最近取り組んでいること

  • CTF

    おなじみの.初心者で覚えることが多すぎるけど,ネットワークがどのように動いているのかとかを調べて試してみたり,結構楽しいので,幸せなら(ryってやつですね.

  • Python

    3の方です.Pythonを使って数学してみたいし,統計する予定.

  • アルゴリズム

    Pythonを使ってアルゴリズムを実際に実装してみる(コードはとても見にくい).

    やりたいこと

  • ゲーム作ってみたいですね.
  • C++も勉強する予定
  • twitterクライアント作りたいですね.

    最後に

    markdown記法便利だね.

というわけで以後お見知り置きを.