12
1
Description
Write a function f(m, G)
that accepts as its arguments a mapping m
, and a set/list of distinct, non-negative integers G
.
m
should map pairs of integers in G
to new integers in G
. (G
, m
) is guaranteed to form a finite abelian group, but any element of G
may be the identity.
There is an important theorem that says:
[Each finite abelian group] is isomorphic to a direct product of cyclic groups of prime power order.
f
must return a list of prime powers [p1, ... pn]
in ascending order such that
Examples
f((a, b) → (a+b) mod 4, [0, 1, 2, 3])
should return[4]
, as the parameters describe the group Z4.f((a, b) → a xor b, [0, 1, 2, 3])
should return[2, 2]
, as the parameters describe a group isomorphic to Z2 × Z2.f((a, b) → a, [9])
should return[]
, as the parameters describe the trivial group; i.e., the product of zero cyclic groups.Define
m
as follows:(a, b) → (a mod 3 + b mod 3) mod 3 + ((floor(a / 3) + floor(b / 3)) mod 3) * 3 + ((floor(a / 9) + floor(b / 9)) mod 9) * 9
Then
f(m, [0, 1, ..., 80])
should return[3, 3, 9]
, as this group is isomorphic to Z3 × Z3 × Z9
Rules
m
may either be a function (or function pointer to some function)Int × Int → Int
, or a dictionary mapping pairs inG × G
to new elements ofG
.f
may take its parameters in the opposite order, i.e. you may also implementf(G, m)
.Your implementation should theoretically work for arbitrarily large inputs, but need not actually be efficient.
There is no limitation on using built-ins of any kind.
Standard code-golf rules apply. Shortest code in bytes wins.
Leaderboard
For your score to appear on the board, it should be in this format:
# Language, Bytes
var QUESTION_ID=67252,OVERRIDE_USER=3852;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
If
m
is allowed to be a dictionary, could you provide the test cases as dictionaries as well? – Martin Ender – 2015-12-21T17:20:13.663I considered it, but they're pretty big, especially the last case (thousands of key-value pairs), and I can't think of a very good format for them. It's probably easier for answerers to copy the function definitions, and then construct the dictionaries themselves (with something like
for a in G: for b in G: d[(a, b)] = m(a, b)
). – Lynn – 2015-12-21T17:25:46.443I think it is correct. I can't make sense of your paste well enough to verify what is going on, but this should prove it: https://bpaste.net/show/5821182a9b48
– Lynn – 2015-12-21T20:55:59.553To help wrap your head around it: it operates on ternary numbers with trits in the format
AABC
, treating them as triples(A, B, C)
, with pairwise addition modulo(9, 3, 3)
. – Lynn – 2015-12-21T20:58:28.423Oh, I just realized my (very stupid) mistake. Thank you for your snippet! – flawr – 2015-12-21T21:27:06.657