2014年11月27日木曜日

選手視点撮影で見るテニス

テニスの試合はだいたい上からコート全体を見渡すように見ることが多い。

ゲームの全体像はよく分かるのだけど、縦(高さ)の変化は観察しにくい。

選手視点から見ることで、体感的なボールの変化や威力を見ましょう!

※上から視点の動画も貼ってます。

で、いきなり上視点だけど・・・

サーブ。

現在の世界最速はサミュエル・グロスの260km/h超。残念ながらその動画が見つからないので、劣らずビッグサーバーの動画を貼ります。


Milos Raonic serve 4 ace vs Roddick + ace a 150 mph


帽子をかぶっていない方:ライオニチはたしか自己最速250km/h超を持つビッグサーバー。
対して相手は元世界最速サーバーのロディック。



では、選手視点。

Roger Federer Serving/Receiving (Bonus Mini Tweener and Propeller) - US Open 2013




Juan Martin Del Potro Groundstroke Practice 3 - US Open 2013




Andy Murray-Juan Monaco Training 2013 Court Level View



Del Potro vs Gasquet Training Match 2013 (Court Level)

片手バック:ガスケも両手バック:デルポトロもフォアは薄く握っている。
デルポトロは長身を活かし、薄い握りからの直線的軌道のフラットショットが鋭い。



Rafael Nadal Heavy Hitting 2014-COURT LEVEL VIEW


青帽子:ナダルはエクストリーム・ウェスタン?という標準的なボレーやサーブの握りからひっくり返した握り近い非常に厚い握り。回転をグリングリンのグリングリンにかける選手。

通常、回転をかけると速度が落ち、できるだけ速度や威力を維持しようとすると体力を使う。
しかしながら、ナダルはとんでもない回転量のくせに速い。



Kei Nishikori Practice US Open 2014
 
最後のラリーは強烈ですね。
にしても、錦織のバックの握りは両手ともイースタンらしいけどどうやって打ってんだか^^;



Janowicz v. Dimitrov 2013 US Open practice
http://youtu.be/L6mCgdyi8xU



Stefan Kozlov - BNP Paribas Open First Round Qualifier (vs. Sam Groth)

奥が世界最速サーバーのサミュエル・グロス


Australian Open 2012 R3 - Federer vs Karlovic highlights HD


白帽子のでかいのが元世界最速サーバー(前:ロディック、次:グロス)のカルロビッチ。記録250km/h超。
2mを超える長身からのサーブ。




2014年10月27日月曜日

Windows8.1がクソな件(俺にとって)。

研究室で使うPCを買ってもらえたのでとりあえず8.1をインストールしてみた。

まずよく言われていた電源の所在・・・

確かに左端にあるアイコンを右クリックしたらでてきた。

で、とりあえずクリック、シャットダウンできたなうんうん・・・・とは行かないようだ^^;

自作PCなのでパーツの相性がわるかったのか原因は不明だが、シャットダウンして数秒後勝手に再起動してしまう問題が発生。

この件についてはまだ解決していないのだが、調査している過程でWindows8および8.1ではシャットダウンしてもシャットダウンしていないことが分かった(もしかしたらマザーボードの方の機能かもしれないけど)。

これはシステム的には正常なのだけど、従来ユーザーとしては問題。

デフォルトではシャットダウンは従来の休止状態のようなものらしい。

別途、非常に回りくどい操作をして完全にシャットダウンしなくてはならない。

さらに調べていると、一応電源オプションから標準のシャットダウンは従来通り完全にシャットダウンする設定が可能らしい。

UIもタッチパネルを意識したもののようで、従来通りのキーボードとマウスでは非常に使いにくい。慣れの問題かもしれないが。

でもいちいちデスクトップのタブ?ボタン?をクリックしないと従来のようなデストップに行けないのが面倒。

また、タッチ向けのタブ?ボタン?でアプリケーションを起動した後アプリケーションの閉じ方がわからない。

まだ調べてないけど、単に履歴なのか、バックに退避したのかよくわからん状態が非常に気持ち悪い。

他にもまだ問題は出てきそう。とりあず調査と慣れしかないのかな。

8系はシステム自体の性能は従来より高性能となっているらしいしので今はそれについては何も言わないし分からないけど・・・

もうすぐwindows10がでるそうだが、とりあえずWidows8系のUIはクソだ。

たしかこのUIの実装を強行したトップはクビになったと聞く。たぶん時期が早すぎたのだとおもうが、今は本当にクソだと思う。

2014年10月26日日曜日

ASRock Fatal1ty Z97 Killer インターネットに繋がらない問題







PCを自作したのだがネットに接続できない問題が起きた。

接続方法は有線。

デバイスマネージャを見たところネットワークアダプタの項目がない・・・インストールされていない?

調べてみるとマザーボードがおかしい?かもということでBIOSメニューからLANに関する項目を有効にしていったが、解決せず。

さらに調べているとBIOSの更新やらなんやらで解決できるかも・・・とあったの実践。

すると結果的に見かけ上解決した(根本的に解決できたかは不明)。

以下、その作業について記しておきます。

ただし一切保証できないので参考程度に、実行は自己責任です。

【スペック】
OS : Windows8.1 64bit English版
CPU : Intel Core i7-4780
GPU : NVIDIA GEFORCE GTX750
RAM : DDR3 4GBx2
M/B : ASRock Fatal1ty Z97 Killer

【1. BIOSの更新】
■1.1
別途ネットに接続できる端末からメーカーHPへ行き、BIOSのアップデートファイルをダウンロード。
http://www.asrock.com/mb/Intel/Fatal1ty%20Z97%20Killer/index.jp.asp?cat=Download&os=BIOS


■1.2
Windows版をダウンロードし、解凍後USBメモリに保存し問題のPCでwindowsを起動しexeファイルを実行。

■1.3
終わると再起動。

以上、BIOS更新作業終了。



【2. ドライバのインストール】
■2.1
BIOS更新同様。HPからドライバを落としてくる。
http://www.asrock.com/mb/Intel/Fatal1ty%20Z97%20Killer/index.jp.asp?cat=Download&os=Win8a64

↓ダウンロードしたもの
・INFドライバ
・Atheros Lanドライバ

INFドライバはよくわからない。ググって一番上あたりに出てきたページではチップセットの最適化に関するものらしく、他のドライバよりもまず一番にインストールすべきものらしい。
したがって、これを↓2.2では先に実行、インストールする。

------[追記]-------

回りくどかったですね。
別途ダウンロードしなくても、付属のCDを使えば問題無いと思います。
付属のCDの存在を完全に忘れていた。
-------------


■2.2
BIOS更新同様。USBメモリ等に解凍して持ってくる。
INFドライバのインストール後、Atheros Lanドライバをインストール。

終わったら再起動。

以上、ドライバのインストール終了。



以上の作業でとりあえずネットに繋がるようになりました。つながらない場合は他の方法を調査検討しましょう。







2014年10月23日木曜日

【動画】ディレーラー調整【バイクメンテナンス】

変速機の調整です。


お店でバイクを買った場合、調整ボルトを触ることってまず無いと思います。

一度適正に調整した場合、それが狂うことってめったにないらしいです。

調整ボルトをいじるのは1からバイクを組んだりディレーラー交換等した時くらいだと思います。



【リアディレーラー】








【フロントディレーラー】







新品価格
¥37,930から
(2014/10/23 16:55時点)

2014年10月19日日曜日

【動画】リアハブ【バイクメンテナンス】

随時更新していきます。


日本語の解説動画は・・・もっとよく検索すればでてくるかもしれないけれど、海外(基本的に英語)の方が簡単にヒットするのでこちらを採用しました。

まぁとにかく視覚情報!って人は参考にどうぞ。

英語が分かる、同時に英語も勉強したいって人もどうぞ。





ディスクブレーキのローターには油分が付かないように注意しましょう。


Shimano XT rear hub service



What Is Inside A Bike Freewheel/How Does It Work?



博士の異常な鼎談 宮台真司 教育問題のウラ 平成19年5月15日






こういう話を聞くと、ゆとり教育には賛成かな。


僕はエリートではないし微積も大学院に入るまで知らなかったけれど・・・(まぁ高校は普通科じゃなかったから仕方ないけれど。で今は微積が分かってないと話にならない世界にいるから高校までで微積やベクトルくらい教えてほしかったって思いもあるのだけれど・・・)

2014年10月1日水曜日

JKの制服。



京都派
でも河原町でよく見かけてたJKは短いのが多かったような・・・修学旅行生だったのかな?



椙山かな



愛知かな
兵庫って・・・神戸行くとこんなんなんや(これも捨てがたい)。どっちかって言うと大阪のイメージがあった。田舎とはちがうのか・・・。






【kinect使ってみる。】座標のずれ

kinect記事前回では、depth画像とcolor画像の座標のズレを合わすところまで入てやりました。

↓これで座標を変換しているらしい
NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution()

しかし、それでも若干ずれている気がする~で終わりました。 

今回はそれをとりあえず直すことをやってみます。



※プログラミングスキルは初心者なので間違いや無駄等あると思います。


事前にに保存した画像でなんやかんややるので下記のプログラムではKinectは使っていません。


#include <iostream>
#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char* argv[]){

 Mat depth, depth2; //depth2:ズラす用
 int counter = 0;
 char readBuf[256];
 char writeBuf[256];

 //動画で書き出す用
 //double fps = 15;
 //VideoWriter wDepth("wDepth.avi", CV_FOURCC('D', 'I', 'B', ' '), fps, cv::Size(640, 480), true);

 while (1){

  //事前に保存した画像の読み込み
  /*
  保存時にファイル名に連番を振っていたので
  counterで番号を回しながら読み込んで行きます。
  自分の場合、別のディレクトリに保存していました。
  */
  sprintf_s(readBuf, "..\\元画像保存ディレクトリ\\ファイル名%04d.jpg", counter);

  depth = imread(readBuf);
  depth2 = Mat::zeros(480, 640, CV_8UC3); //とりあえず真っ黒を用意
 if (depth.data == NULL) break;

  for (int y = 0; y < depth.rows; y++){

   Vec3b* ptrDepth = depth.ptr<Vec3b>(y);
   Vec3b* ptrDepth2 = depth2.ptr<Vec3b>(y); //ズラす用

   for (int x = 0; x < depth.cols; x++){

    if (x + 13 < depth2.cols)
     ptrDepth2[x + 13] = ptrDepth[x]; //ここで右に13ズラす

   }
  }


  //表示
  cv::imshow("depth", depth);
  cv::imshow("depth2", depth2);


  //静止画で書き出す
  sprintf_s(writeBuf, "保存先ディレクトリ\\保存ファイル名%04d.jpg", counter); 
  imwrite(writeBuf, depth2);

  //動画で書き出す
  //wDepth << depth2;

  //キー入力
  int key = cv::waitKey(10);
  if (key == 'q') break;


  counter++;
 }//while

 //終了
 //wDepth.release();
 cv::destroyAllWindows();
}








実行結果
元画像:



ずらした画像:





別途編集ソフト使って重ね合わせてみる
color画像:



color画像と元depth画像:




color画像とズラしたdepth画像:







画素にアクセスして x について右にズラしただけです。

ずらしたものを静止画で保存しています。

元の深度画像とカラー画像を合わせてみると横方向にずれているように見えます。

それを単純に右にずらしました。なんとなく合ってるよね?

(もし、元画像の方でdepthとcolorで取得のタイミングが異なる場合は時間とかでラベル付けしたり肉眼で比較してみて合わせてだいたい同じタイミングの画像を探してみるとか。)


きっともっとスマートな方法があるのだと思いますが、勉強不足ゆえこんな感じです。

肉眼を頼りにずれを調節しているので、正確さは保障できないと思います。とりあえずです。



今回は以上。


---[追記]-----

ある論文(出典見失った;・・・たしか阪大かどこかだったような)によると
Kinectはカラーカメラとデプスカメラは非同期らしいので、そもそもズレがあるようです。
ただ、フレームを取得する間隔はどちらも一定で、その幅がカラーとデプスでは異なるようなのでズレが生じているらしいです。

まぁだから↑のように単純に座標をズラしただけじゃダメってことだと思います。

ただXBOX版の時の話なので、今はどうなのか・・・。また調べてみようと思います。

--------


参考:
http://d.akiroom.com/2012-06/opencv-pixel-read-write-get-set/
http://kassymemo.blogspot.jp/2011/09/opencv2cvmat.html











2014年9月25日木曜日

【kinect使ってみる。】

kinect v2だっけ?新しいバージョンが発売するそうだけど、それはwindows8専用らしいです。

でとりあえずwindows版とxbox版が手元に転がっていたのでこれらを使ってこれから遊んでいこうと思います。





試しにこのサンプルを使ってみます。

プレイヤーの認識とかは今回は使わないのでカットして、colorカメラの表示、depth座標をcolor座標に変換するのを加えてみました。

だいたいコピペです。
でも正しいかどうかは素人勉強中のためよくわかっていません。
プログラミングスキルもカスなのでご了承を。
逆にアドバイスもらえると嬉しいです。


環境:
windows7 64bit home premium
visual stadio 2013
openCV2.4.8
kinect for windows SDK v1.8


#include <Windows.h>
#include <NuiApi.h>

#include <iostream>
#include <conio.h>

#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

void main()
{
 try {
  int count = 0;
  ::NuiGetSensorCount(&count);
  if (count == 0) {
   throw std::runtime_error("利用可能なKinectがありません");
  }

  INuiSensor* kinect;
  ::NuiCreateSensorByIndex(0, &kinect);

  //変更
  kinect->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH | NUI_INITIALIZE_FLAG_USES_COLOR);

  //追加:colorHandle
  HANDLE depthHandle;
  HANDLE colorHandle;

  //追加
  //depth
  kinect->NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480, 0, 2, 0, &depthHandle);
  //color
  kinect->NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, 0, 2, 0, &colorHandle);

  DWORD width = 0;
  DWORD height = 0;
  ::NuiImageResolutionToSize(NUI_IMAGE_RESOLUTION_640x480, width, height);

  while (true) {
   // 距離カメラのフレームデータを取り出す
   NUI_IMAGE_FRAME depthFrame = { 0 };
   kinect->NuiImageStreamGetNextFrame(depthHandle, INFINITE, &depthFrame);
   
   //追加:colorカメラのフレームデータを取り出す
   NUI_IMAGE_FRAME colorFrame = { 0 };
   kinect->NuiImageStreamGetNextFrame(colorHandle, INFINITE, &colorFrame);

   // フレームデータを元に、拡張距離データを取得する
   BOOL nearMode = FALSE;
   INuiFrameTexture *frameTexture = 0;
   kinect->NuiImageFrameGetDepthImagePixelFrameTexture(
    depthHandle, &depthFrame, &nearMode, &frameTexture);
   //追加:color
   INuiFrameTexture *colorframeTexture = colorFrame.pFrameTexture;

   // NUI_DEPTH_IMAGE_PIXELを取り出す
   NUI_LOCKED_RECT rectDepth = { 0 }; //名前変えたrect→rectDepth
   frameTexture->LockRect(0, &rectDepth, 0, 0);

   //追加:カラー
   NUI_LOCKED_RECT rectColor = { 0 };
   colorframeTexture->LockRect(0, &rectColor, 0, 0);

   NUI_DEPTH_IMAGE_PIXEL* depthPixel = (NUI_DEPTH_IMAGE_PIXEL*)rectDepth.pBits;

   // 表示する
   cv::Mat cameraDepth(height, width, CV_8UC3);
   //追加
   cv::Mat cameraColor(height, width, CV_8UC4, reinterpret_cast<ushort*>(rectColor.pBits));

   for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
     int depthIndex = (y * width) + x;

     //追加
     unsigned char iro = depthPixel[depthIndex].depth * 255 / 1000;

     //追加:depthとcolorの位置合わせ    
     LONG colorX = 0;
     LONG colorY = 0;
     kinect->NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution(
      NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480,
      nullptr, x, y, 0, &colorX, &colorY );
     int cameraIndex = ((colorY * width) + colorX) * 3; 
     

     //追加
     //1mより遠い場合
     if (depthPixel[depthIndex].depth > 1000) {
      cameraDepth.data[cameraIndex] = 0;
      cameraDepth.data[cameraIndex + 1] = 0;
      cameraDepth.data[cameraIndex + 2] = 0;
     }
     else{ // 1mより近い場合
      cameraDepth.data[cameraIndex] = iro;
      cameraDepth.data[cameraIndex + 1] = iro;
      cameraDepth.data[cameraIndex + 2] = iro;
     }
    }
   } 

   imshow("depth", cameraDepth);
   //追加:カラー表示
   imshow("color", cameraColor);

   kinect->NuiImageStreamReleaseFrame(depthHandle, &depthFrame);
   //追加  
   kinect->NuiImageStreamReleaseFrame(colorHandle, &colorFrame);

   int key = cv::waitKey(10);
   if (key == 'q') {
    break;
   }
  }
 }
 catch (exception& ex) {
  cout << ex.what() << endl;
 }
}




実行結果(あるフレームでの)
Color:


Depth:


1mより先は黒で塗りつぶしています。
あと若干まだ座標のズレを感じます。距離画像の方が左に10画素くらい。


参考文献

2014年9月21日日曜日

【動画】フロントサスペンション メンテ【バイクメンテナンス】



RockShox Pike lower leg service


Fox F100RL Service

How To Service a Fox Float fork - basic fork maintenance - Flow Mountain Bike











2014年9月16日火曜日

Leap Motion プログラミング

Leap Motionの本がいつの間にか出てた。





デバイス自体は既に手元にあったのだけれど、SDKのサンプルだけ触って放置してた^^;

んで本が出たということで、早速注文した。

これからいろいろ遊んでみようと思う。

OpenNIでも動かせるらしいけど既に開発終了、閉鎖しているのでどうなんだろうか・・・。



2014年8月29日金曜日

画像の書出(1)【OpneCV】【C++】


やったことのメモ。

cv::imread("filename", img);   // img : 画像    filename : この名前で保存
※参考: http://opencv.jp/opencv-2.1/cpp/reading_and_writing_images_and_video.html



画像の書出
#include <opencv2\opencv.hpp>

int main(int argc, char* argv[]){

 cv::Mat img = cv::imread("lena.jpg");

 //グレースケール
 cv::Mat imgG = cv::imread("lena.jpg", 0);

 //保存
 cv::imwrite("lena2.jpg", img);
 cv::imwrite("lenaG2.jpg", imgG);
}


実行結果
元画像 lena.jpg:


保存 lena2,jpg, lenaG2.jpg:




使用した画像はOpenCVのsampleに入っていたもの。
JPEGの品質(CV_IMWRITE_JPEG_QUALITY)はデフォルトで95(0-100)。値が高いほど高品質。







画像の読込【OpenCV】【C++】

やったことのメモ。

cv::Mat img = cv::imread("filename");    // 画像の読み込み
cv::namedWindow("window name");      // ウィンドウ作成
cv::imshow("window name", img);         // ウィンドウ表示
cv::waitKey(0);                        // 0のとき何かキー入力があるまで待つ

※参考: http://opencv.jp/opencv-2.1/cpp/user_interface.html



画像の読込と表示
#include <iostream>
#include <opencv2\opencv.hpp>

int main(int argc, char* argv[]){

 cv::Mat img = cv::imread("lena.jpg");

 //グレースケール
 cv::Mat imgG = cv::imread("lena.jpg", 0); //flag=0でグレースケール

 cv::namedWindow("img");
 cv::namedWindow("imgGray");
 cv::imshow("img", img);
 cv::imshow("imgGray", imgG);
 cv::waitKey(0);
}


実行結果



使用した画像はOpenCVのsampleに入っていたもの。







2014年8月21日木曜日

単位取り終えた。

単位を全部(厳密には修論が残ってるが)取り終えた!


これで講義から解放される^^


一応、夏期集中講義の履修はしていたがこれで出る必要がなくなった。


研究に専念できる。


まぁ前期(クウォーター制)でも卒業に必要な講義単位は取り終えているのだけれど、自分は科目少し多くとらないといけない研究にしたから今期まで講義を受けていたのだけれど・・・


で今期は2科目履修してどちらも60ぴったりだった。


片方はやさしいと評判?の先生の講義、もう片方はボスの講義。


たぶんどちらも温情だったと思う。


でも可がもらえたのだからこれで無事終了だ。


分野外のしかも文系のそれも底辺出身の自分であるけどよくやった、自分で言うのもなんだが。


とりあえずこれからガッツリ研究やな。

2014年7月15日火曜日

[alt]押しながら[tab]押してみろ、行き過ぎたら[shift]も押してみろ。【ショートカットキー】

[ alt ] + ([ shift ] +) [ tab ]

これで複数のウィンドウを開いるとき、素早く起動中のウィンドウの切り替えができる。

[ shift ]を押すと逆方向へウィンドウの切替え選択ができる。

いちいちマウスでポチポチやったり、ウィンドウの位置を動かしすぎて迷子になることもない!

できるビジネスマンはショートカットキーを使う!()

文字を入力するだけがキーボードやないねんで!


あと、[ alt ] + [ ctrl ] + [ tab ]にすると[ alt ]キーを押し続けなくてもよくなる。


ちなみにこのショートカットキーはUbuntuでも同じように使えた。

2014年6月30日月曜日

タカシやめなさい!【懐かしいCM】【Intel】





タカシ母の最後のセリフはいつ見ても意味深?でおもしろいw



なぜ「やめなさい!」なのか。



タカシのあるいはタカシの母として大事な何かを守るため?



とにかくいつ見てもちょっとおもしろいw



ちなみにIntelはPCのパーツを作っている。PCの完成品のメーカーじゃなくてPCのあの筐体の中にあるパーツのメーカー。



CPU(PCにおいて頭脳部なり心臓部にあたる)とかを作っている。

2014年6月20日金曜日

メモ:プロセッサ

2つのCPUを比較して、クロック周波数が倍以上高くてもCPIの値によって性能がほとんど変わらないどころかクロック周波数の低いCPUの方が高性能となる場合もある。

2014年5月17日土曜日

中国人の剰余定理

備忘録。


数学のことはよくわからないのでところどころ端折っている。あと結局間違ってる可能性も・・・。

とりあえず、こんなことできる方法がある!程度のメモ書き。






たとえばという数を323で割ったあまりを求めたいとき。

暗算でも手計算でも電卓でもパソコンでも何でもいいけど使って求められるだろうか?

僕は初見ではどれも不可能だった。

暗算なんてくらいまでしかできないw手計算したけどで紙を破いた。電卓は簿記で使ってものを用いたが桁が余裕で足りない。パソコンはC言語で素直に計算させたら桁が足りなかった。各桁用の配列を作ればたぶん簡単だと思うけど。とりあえず


・・・どうしたものか。


離散数学の授業でこんな問題を解決してくれる方法を習ったのを思い出した。

それが中国人の剰余定理。

特にちゃんと理解はしてないけれど過程をざっくりメモっとく。

「中国人の剰余定理」

 (23の95乗を323で割った余り)

→323を素因数分解する。 

17, 19を約数に持つ(この2つの数は素数で、323は1とこの2つの素数しか約数に持たない)、より

 は


の2つに分解できる。

ここでラグランジュの定理を用いる。

ラグランジュの定理はここでは(nは0を含む自然数)を19, 17で割った余り=1となる形を見つけるってこと。

ということで

 (23^9を19で割った余りは1)
 (23^17を17で割った余りは1)

(なんで「≡」合同記号なのかは分からない^^;)

で、をこの2つを使って表現していく。



mod 19のとき。



は1だからと同じ。








(補足)--------





 さらに19で割ると余りは 

--------------








112をさらに19で割る→余り17





同様にmod 17でもやる。



(補足)--------



--------------







※32はまだ17で割れるから、割った余りは15




ここで



を満たすXが存在する。

a = 17, b = 15 とおく。


19と17の最小公約数は1

ここで

 (後でS_1とS_2のところで使う)

とする。

拡張ユークッリッド互除法を使う。


    ・・・19÷17=1 余り2

          ・・・17÷2=8 余り1

     ・・・2÷1=2 余り0

よって













よって



ここでS_1とS_2を以下のように設定する。



(↑  を代入した。)








とするので各値を代入すると





つまり

 ・・・23の95乗を323で割った余りは


「321」