supermabさんから「関数で出来ますか~?」用に頂いた問題を
倉庫の奥に封印していました。しかし、興味があるので見せてみろと
いう声が高まってきたのでその封印をときます。
それは・・・オイラーのΦ関数です。
**************************************************************************************
オイラーのφ関数は、
正の整数 n に対して、1 から n までの自然数のうち
n と互いに素なものの個数を φ(n) として与えることによって定まる
数論的関数 φ である。
例えば、1, 2, 3, 4, 5, 6 のうち 6 と互いに素なのは 1, 5 の 2 個であるから、
定義に拠れば φ(6) = 2 である。
また例えば 1, 2, 3, 4, 5, 6, 7 のうち 7 以外は全て 7 と互いに素だから、φ(7) = 6 と定まる。
慣例的に φ(n) と表記されるため、オイラーの φ 関数(ファイかんすう、phi function)とも呼ばれる。
※:上の説明は、「http://ja.wikipedia.org/wiki/オイラーのφ関数」 の引用です。
問題
セルC4に2以上1000以下の整数を入力し、それをnとする時、
φ(n)をセルC6に表示させよ。
(supermabさん談)
*
*
*
*
*
supermabさんの参考ファイル:up0390.zipをダウンロード
1セルでやるとすると、厳しいかな?
投稿情報: y sakuda | 2010年3 月 4日 (木曜日) 午後 08時18分
さて他のみなさんは何て仰るか・・・
投稿情報: くまぷー | 2010年3 月 4日 (木曜日) 午後 08時36分
ただいまーーーー
ん、、、
算数は、好きだが、、、
これ、、、数学だなーーー
どひゃーーーー
って、
互いに素、、、、、、
そ、そ、、、それから、、意味を考えねば…・
投稿情報: jyo-3 | 2010年3 月 4日 (木曜日) 午後 09時22分
2~1000限定なら何とかなるかも・・・・
投稿情報: y sakuda | 2010年3 月 4日 (木曜日) 午後 10時12分
> 2~1000限定なら何とかなるかも・・・・
あ、、あは・・・・
はぇーーー
投稿情報: jyo3 | 2010年3 月 4日 (木曜日) 午後 10時28分
甘かった・・・・・
投稿情報: y sakuda | 2010年3 月 4日 (木曜日) 午後 10時44分
これも、、、
本職と、、、関連の、、匂い・・・・・
だが、、、高等な、、、数学、、、むむーーーー
投稿情報: jyo-3 | 2010年3 月 4日 (木曜日) 午後 11時11分
合っているのかどうか定かではないし、ダサくかつ長大なしろものですが、出来たつもり・・・・
139
投稿情報: y sakuda | 2010年3 月 5日 (金曜日) 午前 12時04分
ダイエットすれば100前後にはなりそうですが、検証方法考える方が先だな・・・・
投稿情報: y sakuda | 2010年3 月 5日 (金曜日) 午前 01時18分
一応、93までダイエット
今晩か明日検証方法を考えますが、合ってなかったらちょっとショックかも^^;
それにしてもminさんむ印さん出てこないし、肝心なsupermabさん見てないのかな・・・
投稿情報: y sakuda | 2010年3 月 5日 (金曜日) 午後 07時35分
EWで呼んでみたw
投稿情報: y sakuda | 2010年3 月 5日 (金曜日) 午後 07時37分
まだ意味わかってない、、、みたい、、わたし。。
投稿情報: ジョー3 | 2010年3 月 5日 (金曜日) 午後 07時56分
>まだ意味わかってない、、、みたい、、わたし。。
互いに素とは、1以外の公約数がない数字のペアと思ってよろしいかと思います。
投稿情報: y sakuda | 2010年3 月 5日 (金曜日) 午後 08時48分
>EWで呼んでみたw
ありがとうございます。
supermabさんが現れないのは
私が無神経だったからだと実は
気に病んでいます・・・
supermabさんの許可を得ずに
「関数で出来ますか~?」と違うところで
取り上げてしまいました・・・
ご免なさいです・・・
投稿情報: くまぷー | 2010年3 月 5日 (金曜日) 午後 09時52分
>ご免なさいです・・・
ん、、、すんぱいないと、、、おもう、、、
忙しいだけでしょう……
投稿情報: jyo-3 | 2010年3 月 5日 (金曜日) 午後 10時51分
検証プログラム作って見たら、やはりおかしかった・・・・・
やはり甘くないですねーー
原因は分かったけど、上手く直せるかな?
投稿情報: y sakuda | 2010年3 月 6日 (土曜日) 午前 01時56分
寝ようと思ったけど、悔しいから取りあえず修正しましたが・・・・・・
無茶苦茶重くなって、1回の計算に0.5秒くらいかかって、わずか1000までのチェックが延々と継続中。
コンピュータがやっているとは思えないスピードw
投稿情報: y sakuda | 2010年3 月 6日 (土曜日) 午前 02時20分
>コンピュータがやっているとは思えないスピードw
それでもなんとか式が作れれば
たいしたもんだと思う・・・
投稿情報: くまぷー | 2010年3 月 6日 (土曜日) 午前 06時43分
93を改造して103
一応1000まで検証プログラムと意見が一致しました。
が・・・・検証プログラム合ってるのかな?
投稿情報: y sakuda | 2010年3 月 6日 (土曜日) 午前 08時44分
気がついてませんでした ^^;;;
しかーし、103 とか・・・
ワンセルでは出来ないと思っていたのですがぁ~
投稿情報: supermab | 2010年3 月 6日 (土曜日) 午前 09時45分
でも、関数で出来ますか?ではないので、
作業セルを使って解いたりいろいろアリですね。
面白いかも~
先に出題者解答例を出してしまいましょうか?
ワンセルではないけど・・・
投稿情報: supermab | 2010年3 月 6日 (土曜日) 午前 09時58分
アップしました↓
URL(本人の依頼により削除)
初歩的な方法ですが、φ関数の意味が
判りやすくなるんじゃないかと思います。
ワンセル関数の検証用に使えるかもw
F9キーで数値が変わります。
投稿情報: supermab | 2010年3 月 6日 (土曜日) 午前 10時20分
↑にアップするのはまずいと思います
>ワンセルでは出来ないと思っていたのですがぁ~
何とかなったつもりですが・・・・・
合ってるかな?
投稿情報: y sakuda | 2010年3 月 6日 (土曜日) 午後 02時53分
チェックプログラムをチェックするために、私のチェックプログラムでsupermabさんのファイルをチェックして見ました。
チェックOKと出ましたので、私のチェックプログラム合っていると言うことになります。
だから、スピードはともかく私の103大丈夫見たい^^
#何回チェックって書いたかな、この記事・・・
ジョー3やminmaxさんがやるかもしれないので、私の103はもう少し伏せて置き、ダイエットできるかどうか考えます。
投稿情報: y sakuda | 2010年3 月 6日 (土曜日) 午後 03時31分
では、参加者があと2人増えて3人になったら
これを急遽、「関数で出来ますか~?」の
第52問としましょう(^^ゞ
投稿情報: くまぷー | 2010年3 月 6日 (土曜日) 午後 03時38分
>3人
mabさんは別として、ジョー3とくまぷーさんで3人w
投稿情報: y sakuda | 2010年3 月 6日 (土曜日) 午後 03時39分
>第52問としましょう(^^ゞ
ふふ、、、
・・・・・・そかそか、、、
投稿情報: jyo-3 | 2010年3 月 6日 (土曜日) 午後 05時53分
>ジョー3とくまぷーさん
いやあ、ジョー3さんはともかくおいらじゃ・・・
minさん、む印さん、からくちさんとか・・・
投稿情報: くまぷー | 2010年3 月 6日 (土曜日) 午後 08時56分
構想はあるが、式にするのが難しいですね。
ということで、私は、、、
今日長男の高校の卒業式に参加(長男は出席できませんでしたが)して特別な思いがありました。
くまぷーさんとこは終わりました?
投稿情報: min | 2010年3 月 6日 (土曜日) 午後 09時16分
>ということで、私は、、、
minmaxさんは今回リタイアですかね?
とすると、たよりはやはりくまぷーさんですね。
からくちさん、む印さんは覗いてないのかな?
私はやったことはやりましたが、どう考えてももっとエレガントなやり方がありそうだと・・・・・
投稿情報: y sakuda | 2010年3 月 6日 (土曜日) 午後 09時40分
>くまぷーさんとこは終わりました?
まだです。月曜です。
>たよりはやはりくまぷーさんですね。
おいらはぜんぜんダメです (T.T)
投稿情報: くまぷー | 2010年3 月 6日 (土曜日) 午後 10時21分
>おいらはぜんぜんダメです (T.T)
だめですかーー
明日の晩あたりまでにどなたか名乗りでない時は、あきらめて晒しちゃいましょうか?
投稿情報: y sakuda | 2010年3 月 6日 (土曜日) 午後 10時36分
↑
そうですね~
む印さん、からくちさん、見ていないのかな~
ジョー3さんはどうですか~?
投稿情報: くまぷー | 2010年3 月 6日 (土曜日) 午後 10時47分
ダイエットできない・・・・・
投稿情報: y sakuda | 2010年3 月 7日 (日曜日) 午前 01時01分
ただいまーーー
さて、ちょっとやってみようかなーーー
投稿情報: jyo-3 | 2010年3 月 7日 (日曜日) 午前 11時45分
ジョー3さん、進行状況は如何でしょう?
>ただいまーーー
こちらはこれから体育館に・・・
行ってきま~す (^o^)/~~~
投稿情報: くまぷー | 2010年3 月 7日 (日曜日) 午後 01時33分
ただいまーーー
お昼ちょっとやったが、、駄目だったです。
さて、
碁をまず、、・・・・
投稿情報: ジョー3 | 2010年3 月 7日 (日曜日) 午後 03時47分
なんか、ジョー3難航してるみたいだな・・・
碁の後飲んじゃうと・・・・・
投稿情報: y sakuda | 2010年3 月 7日 (日曜日) 午後 06時23分
>碁の後飲んじゃうと・・・・・
あ、、ああ、、あた・・・・・・・
投稿情報: ジョー3 | 2010年3 月 7日 (日曜日) 午後 08時04分
さて、くまぷーさんどうしましょうか?
投稿情報: y sakuda | 2010年3 月 7日 (日曜日) 午後 09時39分
ファイルのプロパティーを見ると解るように
この問題は、昨年の4月に作りました。
y_sakuda さんの出された
素数判定問題を拡張したものです。
その後、オイラーのφ関数を利用するものとして、
RSA暗号化・多倍長整数などといじっていくことに・・・
あ!それと
>↑にアップするのはまずいと思います
自分のサーバーに移したほうがいいでしょうか?
投稿情報: supermab | 2010年3 月 7日 (日曜日) 午後 09時59分
>自分のサーバーに移したほうがいいでしょうか?
mabさんがアップすること自体は問題ないのですが、あそこはEW外にはアドレスを公開しないことになってますので・・・・
投稿情報: y sakuda | 2010年3 月 7日 (日曜日) 午後 10時05分
>あそこはEW外にはアドレスを公開しないことになってますので・・・・
なるほど!
くまぷーさん、リンクの削除 or 変更お願いします m(_ _)m
投稿情報: supermab | 2010年3 月 7日 (日曜日) 午後 10時11分
>さて、くまぷーさんどうしましょうか?
ジョー3さんが取り組んでいるのなら
もう少し待ってもいいかと思います。
>くまぷーさん、リンクの削除 or 変更お願いします m(_ _)m
了解しました。
このスレのトップからDLできるようにします。
投稿情報: くまぷー | 2010年3 月 7日 (日曜日) 午後 11時15分
>もう少し待ってもいいかと思います。
了解でーーす^^
投稿情報: y sakuda | 2010年3 月 7日 (日曜日) 午後 11時32分
もう一つできました。
が・・・・
もちろん短縮を狙ったアイデアなのですが、結局考え落ちだらけで、そこを補正してったら、146
まあ、当然ダイエットはできるでしょうが、100アンダーは無理っぽい雰囲気です^^;
投稿情報: y sakuda | 2010年3 月 8日 (月曜日) 午前 12時18分
む印さんや、からくちさんから何もないから
sakudaさんの解答発表は今夜くらいですかねぇ・・・
それにしてもオイラーのファイ関数を
ワンセルで作ってしまうとはぶったまげました!
投稿情報: くまぷー | 2010年3 月 8日 (月曜日) 午後 03時04分
むむ・・・・ちょっとやったが、、だめだった。
そーかーーー
素数も、、忘れた。
うーーん、、、
学んでいない。・・・・・
投稿情報: jyo-3 | 2010年3 月 8日 (月曜日) 午後 06時19分
うーーん、、、
理屈的には、、簡単に思えた。
だが、、
1)それを実行する関数が・・・・なんだい?(難題)
2)関数の動きが、、・・・・
(エクセルとまだ、親しくなってない?)
・・・・・・・
時間があれば、すらすら出来る方々、、、
うーーん、、、、・・・・・
・・・・・・
投稿情報: jyo-3 | 2010年3 月 8日 (月曜日) 午後 07時06分
了解です。後刻整理して、1案、2案の両方を投稿します。(10時くらいになるかな?)
投稿情報: y sakuda | 2010年3 月 8日 (月曜日) 午後 07時44分
>10時くらいになるかな
(`◇´)ゞアイアイサー!
投稿情報: くまぷー | 2010年3 月 8日 (月曜日) 午後 07時57分
まだかな?
投稿情報: くまぷー | 2010年3 月 8日 (月曜日) 午後 10時17分
遅くなりました。
第2案も一緒に出そうと思っていたのですが、146のはちゃんと動いているのですが、あまりにもダサイので、ダイエットして128にしたら、2の時気が狂っちゃいました。
分かったつもりで、修正したら、こんどは1000の時がダメw
ということで、第2案の方は後回しにして、第一案だけ提示します。
103文字
{=SUM((ROW(2:999) 1 Then
For K = 2 To wMin
If pX Mod K + pY Mod K = 0 Then
wYaku = K
Exit For
End If
Next
End If
Yakusu = wYaku
End Function
Function Fai(ByVal pI As Long) As Long
Dim J As Long, wCnt As Long
For J = 2 To pI - 1
If Yakusu(pI, J) = 1 Then
wCnt = wCnt + 1
End If
Next
Fai = wCnt + 1
End Function
Sub Check()
Dim I As Long, wF As Long
With ActiveSheet
For I = 2 To 1000
.Range("c4") = I
wF = Fai(I)
If wF <> ActiveCell Then
MsgBox "Error" & I & ":" & wF
Exit For
End If
Next
End With
End Sub
投稿情報: y sakuda | 2010年3 月 8日 (月曜日) 午後 10時33分
・・・で、解答例はどこですか?
投稿情報: くまぷー | 2010年3 月 8日 (月曜日) 午後 10時54分
あっ、すみません。例によって不等号でマクロとごっちゃになってる^^;
再掲
103文字
{=SUM((ROW(2:999)<C4)*(MMULT(N(MOD(ROW(2:999),TRANSPOSE(ROW(2:499)))=0),N(MOD(C4,ROW(2:499))=0))=0),1)}
マクロも再掲します。
Function Yakusu(pX As Long, pY As Long) As Long
Dim wMin As Long, wYaku As Long
wMin = WorksheetFunction.Min(pX, pY)
wYaku = 1
If wMin > 1 Then
For K = 2 To wMin
If pX Mod K + pY Mod K = 0 Then
wYaku = K
Exit For
End If
Next
End If
Yakusu = wYaku
End Function
Function Fai(ByVal pI As Long) As Long
Dim J As Long, wCnt As Long
For J = 2 To pI - 1
If Yakusu(pI, J) = 1 Then
wCnt = wCnt + 1
End If
Next
Fai = wCnt + 1
End Function
Sub Check()
Dim I As Long, wF As Long
With ActiveSheet
For I = 2 To 1000
.Range("c4") = I
wF = Fai(I)
If wF <> ActiveCell Then
MsgBox "Error" & I & ":" & wF
Exit For
End If
Next
End With
End Sub
投稿情報: y sakuda | 2010年3 月 8日 (月曜日) 午後 10時59分
やっとチェックOKになりました^^
第2案の132です。
{=SUM(--(MMULT(N(MOD(ROW(2:999)*(ROW(2:999)<C4),TRANSPOSE(IF(MOD(C4,ROW(2:1000)),9^4,ROW(2:1000))))>0),N(ROW(2:1000)<=C4))=C4-1),1)}
こちらはC4の約数を先に計算し、その約数のいずれでも割り切れない、2~n-1の数を数えています。
自分で作って置いてなんですが、頭がこんがらがる代物w
第1案も第2案もExcel2007ならColumnを使用してTransposeを外せますので、10文字前後減るはずですが、やってません。
投稿情報: y sakuda | 2010年3 月 8日 (月曜日) 午後 11時07分
いや~、本当になんでもできちゃうんですね~
普通、これだけの行数を要するマクロをワンセルに
納めるなんて信じられません。
参りましたm(__)m
投稿情報: くまぷー | 2010年3 月 8日 (月曜日) 午後 11時11分
早く、supermabさん、ジョー3さん、minさんのコメントが見たいものです。
投稿情報: くまぷー | 2010年3 月 8日 (月曜日) 午後 11時13分
>いや~、本当になんでもできちゃうんですね~
私もどなたかが作ったのを見せられたら、えーー?っと思いそうですが、実はこれ案外素直にできちゃいました。
投稿情報: y sakuda | 2010年3 月 8日 (月曜日) 午後 11時40分
おおお~!
出てますね。
あとで、解析します。
投稿情報: supermab | 2010年3 月 9日 (火曜日) 午前 08時29分
sakuda さんーーー
すごいですねーーー
全問に挑戦!!
わたしは、、気が向いたのにだけ挑戦・・・
・・・・・
数学力がすごいのね・・・・・
高校生に教えたりだもんね――ー
・・・・・・
わたしは、小6ぐらいでストップかも、、、
投稿情報: jyo-3 | 2010年3 月 9日 (火曜日) 午前 11時01分
しかし・・・・
他の方の回答見られないってのはつまんない^^;
投稿情報: y sakuda | 2010年3 月 9日 (火曜日) 午後 07時39分
こんばんはぁ~
何やらすごい問題が出題されてたんですね~
しかし、y sakudaさんはまたあっさりと・・・
その頭脳がうらやましいです、、、
私も先ほどちょっと挑戦はしてみましたが
ワンセルでの解答は全く思いつきませんでした。
循環参照ならGCDが活躍してくれるのですが
配列には対応してくれない・・・(ジレンマ)
投稿情報: む印 | 2010年3 月 9日 (火曜日) 午後 07時49分
>GCDが活躍してくれるのですが
私も最初これであっさり・・・と思いました^^;
投稿情報: y sakuda | 2010年3 月 9日 (火曜日) 午後 07時57分
お~、む印さんだ。
きっと何かやってくれるに違いない!
投稿情報: くまぷー | 2010年3 月 9日 (火曜日) 午後 08時56分
>GCDが活躍してくれるのですが
配列には対応してくれない・・・(ジレンマ)
ふふふ、、、、
おれが、、悪いと思ったが、、、
>配列には対応してくれない・
そかそか、、、、そういうことで、
あきらめたわたしも、、
許してもらえるかもね――ー
投稿情報: ジョー3 | 2010年3 月 9日 (火曜日) 午後 08時59分
む印さん、supermabさん、今からでも何か面白いものを考えてくださいませ^^
なんともかんともさびしいw
投稿情報: y sakuda | 2010年3 月 9日 (火曜日) 午後 11時13分
>なんともかんともさびしいw
ん、、、
おめーーー、、げんきだのーーー
・・・・・・・
、、、、、、
・・・・・・むむ・・・・・・
投稿情報: JYO-3 | 2010年3 月 9日 (火曜日) 午後 11時26分
あってるかな?
63:{=COUNT(FIND("/"&E3,TEXT(ROW(INDIRECT("1:"&E3))/E3,"0/????")))}
投稿情報: kir | 2010年3 月10日 (水曜日) 午後 01時04分
>あってるかな?
ほぅほーーー
投稿情報: ジョー3 | 2010年3 月10日 (水曜日) 午後 07時53分
>あってるかな?
合ってます^^
それにしても、63とは凄いですねーーー
それに、私のなんかに比べると、式が単純なだけに無茶苦茶早いです。
それにしても、分数を使って、約分できていないのを探すなんてアイデアには参りました。
やっぱりいろいろやり方がありますねーー
投稿情報: y sakuda | 2010年3 月10日 (水曜日) 午後 08時25分
sakudaさんとkirさんにやって頂いたので
「関数で出来ますか~?」の第52問目と
させて頂きました。
ありがとうございます。
でも、本当になんでもできちゃうんですね~
投稿情報: くまぷー | 2010年3 月10日 (水曜日) 午後 08時41分
あはっ、いつの間にかタイトル変わってるw
投稿情報: y sakuda | 2010年3 月10日 (水曜日) 午後 08時52分
>あはっ、いつの間にかタイトル変わってるw
でへへへ (^^ゞ
投稿情報: くまぷー | 2010年3 月10日 (水曜日) 午後 08時58分
>でも、本当になんでもできちゃうんですね~
いやはや。
もはや、呆れる領域w
投稿情報: supermab | 2010年3 月11日 (木曜日) 午後 12時03分
>合ってます^^
よかった~♪
>互いに素とは、1以外の公約数がない数字のペアと思ってよろしいかと思います。
このヒントがないと最後まで解けなかったと思う。
ちなみに、マクロはGCD使えないんでしょうか?
投稿情報: kir | 2010年3 月11日 (木曜日) 午後 12時44分
>もはや、呆れる領域w
おおーーー
supermab さん、、出した甲斐があったね――
よかったよかった。
投稿情報: JYO3 | 2010年3 月11日 (木曜日) 午後 02時24分
うわー、kirさんスッゴイ、、、、
TEXT(数値,"0/????")で約数が判断出来るんですねぇ~
また又・・・勉強になりました!
投稿情報: む印 | 2010年3 月11日 (木曜日) 午後 05時18分
うむむ、、まてよ、、、
・・・ということは、
{=COUNT(FIND("/"&C4,TEXT(ROW(1:1000)/C4,"[<1]0/????")))}
とすると、56文字にできたぁ~
投稿情報: む印 | 2010年3 月11日 (木曜日) 午後 05時20分
>ROW(1:1000)
www、よく考えたら、、
ROW(1:999)でよかったですよねぇ^^;
投稿情報: む印 | 2010年3 月11日 (木曜日) 午後 05時32分
>このヒントがないと最後まで解けなかったと思う。
確かにkirさんのを見せられると大変なヒントになってますねーー
問題は、自分のヒントには全くなってないことwww
>ちなみに、マクロはGCD使えないんでしょうか?
2007は調べてないですが、ないはずです。
VBAでは普通にできる計算は自分でやれということになってるんでしょう^^
投稿情報: y sakuda | 2010年3 月11日 (木曜日) 午後 08時00分
おおーーー
発展してますね――ー
出題者が、出来ないのも、・・・・・
すごいのねぇーーー
投稿情報: jyo3 | 2010年3 月11日 (木曜日) 午後 09時33分
>出題者が、出来ないのも、・・・・・
supermabさん、他にこれはできないだろうってのありませんか?
出題者できなくても問題にしちゃうってのも一つの手段かも^^
投稿情報: y sakuda | 2010年3 月11日 (木曜日) 午後 10時42分
>出題者できなくても問題にしちゃうってのも一つの手段かも^^
1)それを、、絶対出来ないって、言い切ることもすごいし
2)思いがけない手法で、出来ちゃうってのもすごいし、、、
ありうる、ありうる。
1)と、2)の中間的な、、
3)作業セル1個だけ使えるなら!!!
とか、、、
投稿情報: jyo3 | 2010年3 月11日 (木曜日) 午後 10時55分
>supermabさん、・・・・ありませんか?
出題していいですか?
くまぷーさん!!
投稿情報: jyo-3 | 2010年3 月13日 (土曜日) 午後 05時46分
>出題していいですか?
いいとも~!!
投稿情報: くまぷー | 2010年3 月13日 (土曜日) 午後 08時02分
送りました。
投稿情報: jyo3 | 2010年3 月13日 (土曜日) 午後 08時49分
おお、まだ、続きそう^^
投稿情報: y sakuda | 2010年3 月13日 (土曜日) 午後 10時17分
54{=COUNT(FIND("/"&C4,TEXT(1-ROW(1:999)/C4,"0/????;")))}
でもいいもかな??
投稿情報: min | 2010年3 月14日 (日曜日) 午前 09時43分
minmaxさんの54チェックしました。
OKです。
何度見ても、kirさんのアイデア秀逸^^
投稿情報: y sakuda | 2010年3 月14日 (日曜日) 午前 11時04分